https://www.lintcode.com/problem/digit-counts/description
lintcode第三题
题目描述
计算数字k在0到n中的出现的次数,k可能是0~9的一个值
样例
例如n=12,k=1,在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],我们发现1出现了5次 (1, 10, 11, 12)
代码实现
class Solution:
"""
@param k: An integer
@param n: An integer
@return: An integer denote the count of digit k in 1..n
"""
def digitCounts(self, k, n):
# write your code here
p=n
num=0
count = 0
tmpCount = 0
if k==0:
return n//10+1
if n==0:
return 0
while p != 0:
if p%10>k:
tmpCount=(p//10+1)*(10**num)
if p%10==k:
tmpCount=(p//10)*(10**num)+n%(10**num)+1
if p%10<k:
tmpCount=(p//10)*(10**num)
count += tmpCount
p = p//10
num += 1
return count
思路
从给定的数字n的个位开始,分别看个位,十位,百位,...上出现k数字的数据有多少个。通过一个例子可以发现个位,十位,百位等上的计算数字k出现数据个数有着共同的规律,如下。
对n=723进行分析如下:
- 对个位分析(723的个位是3=723%10):(令p=n)
a. k=1时,n%10>k。个位上为1的数有:001,011,021,031,...701,711,721.共73次=n/10+1.(其实是(p/10+1)*10的0次)
b. k=3时,n%10=k。个位上为3的数有:003,013,023,033,...703,713,723.共73次=n/10+1.((p/10)*10的0次+n%(10的0次)+1)
c. k=4时,n%10<k。个位上为4的数有:004,014,024,034,...704,714.共72次=n/10.((p/10)*10的0次)
- 对十位分析(723的十位是2=723/10%10):(令p=n/10)
a. k=1时,n%10>k。十位上为1的数有:010,011,...,019,110,111,...,119,210,...710,...,719.共80次=(n/10/10+1)*10.(其实是(p/10+1)*10的1次)
b. k=2时,n%10=k。十位上为2的数有:020,021,...,029,120,121,...129,220,...720,...,723.共73次=
(n/10/10)*10+n%10+1.((p/10)*10的1次+n%(10的1次)+1)
c. k=3时,n%10<k。十位上为3得数有:030,031,...,039,130,131,...139,230,...630,...639.共70次=(n/10/10)*10.((p/10)*10的1次)
- 对百位分析(723的百位是7=723/10/10 % 10):(令p=n/10/10)
a. k=1时,n%10>k。百位上为1的数有:100,101,...,109,110,111,...,119,...199.共100次=(n/10/10/10+1)*100.(其实是(p/10+1)*10的2次)
b. k=7时,n%10=k。百位上为7的数有:700,701,...,723.共24次=(n%100)+1=(n/10/10/10)*100+n%100+1.((p/10)*10的2次+n%(10的2次)+1)
c. k=8时,n%10<k。百位上为8的数没有.即0次=(n/10/10/10)*1000.((p/10)*10的2次)
- 等等类似十位,百位分析。
k=0时,不能出现在最高位,单拿出来计算=n/10+1.
n=0时,直接返回0.
参考
https://blog.csdn.net/z_opt/article/details/75570728