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

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

作者: park_one | 来源:发表于2020-03-26 20:42 被阅读0次

    题目描述:求出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)

    代码截图:

     

    相关文章

      网友评论

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

          本文链接:https://www.haomeiwen.com/subject/yddxuhtx.html