统计数字

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值