【剑指Offer刷题小记】整数中1出现的次数(JAVA版)

2020-03-26  本文已影响0人  park_one

题目描述:求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。

问题分析

(1)首先想到的都是最简单的办法,把1到n中的每个数都遍历一遍,把数字转换成字符串或者直接取余判断其中1的个数,累加得到最终结果。很显然,这种方法需要大量的时间,过于暴力。

(2)思考其他办法,首先分析这些数字的特点。随便取一个数举例:

n取1234

可以看到当n取1234时,所有1~n的数中1的总数为:124+130+200+235=689. 直接相加的原因是在每个数位计算的时候,计算重复的数在不同数位上都有1,正好题目是问1的个数,而不是问包含1的数的个数。比如1221,在个位计算了一次,在千位也计算了一次,但由于1221中包含两个1,所以并不用去重(如果是问包含1的数的个数那就要去掉重复计算的)。

根据上面的例子,进一步分析可以得到,对于一个数n的任意一位上的数字a(假设是第i位):

·当a>1时,i位上1的个数为[1+n/(10^i)]*10^(i-1)

·当a=1时,i位上1的个数为[n/(10^i)]*10^(i-1)+n%[10^(i-1)]+1

·当a=0时,i位上1的个数为[n/(10^i)]*10^(i-1)

代码截图:

 

上一篇下一篇

猜你喜欢

热点阅读