#题目
输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中国包含1的数字有1,10,11和12,1一共出现了5次。
分析
如果直接累加1到n中每个整数出现1的次数,采用做除法和求余运算以求出该数字中1出现的次数。如果输入数字n,n有$O(\log{n})$位,因此该算法的时间复杂度是$O(n\log{n})$。运算效率不高。
方法
从数字规律着手明显提高时间效率的解法。
数字的规律:
从右往左,给每位标号1,2,3…,当统计x的次数时,需要分两种情况讨论:$x\in[1,9]$和 $x=0$。
$x\in[1,9]$情况
第i
位上的数字记为t
时,高位记为a
,低位记为b
,因此一个整数可以记为atb
形式。
分下面三种情况:
- 当
t < x
时,高位可取[0, a-1]
,第i位的计数为 $a\times10^{i-1}$。 - 当
t = x
时,高位可取[0, a]
,此时还受低位的影响,第i位的计数为 $a\times10^{i-1} + (b+1)$。 - 当
t > x
时,高位可取[0, a]
,此时不受低位的影响,第i位的计数为 $(a+1)\times10^{i-1}$。
$x=0$情况
第i
位上的数字记为t
时,高位记为a
,低位记为b
,因此一个整数可以记为atb
形式。
分下面两种种情况:
- 当
t = 0
时,高位可取[1, a]
,此时还受低位的影响,第i位的计数为 $(a-1)\times10^{i-1} + (b+1)$。 - 当
t > 0
时,高位可取[1, a]
,此时不受低位的影响,第i位的计数为 $a\times10^{i-1}$。
实现
|
|