3. 统计数字

    xiaoxiao2023-12-22  25

    题目链接:

    https://www.lintcode.com/problem/digit-counts/description

    计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值。

    Example

    样例 1:

    输入: k = 1, n = 1 输出: 1 解释: 在 [0, 1] 中,我们发现 1 出现了 1 次 (1)。

    样例 2:

    输入: k = 1, n = 12 输出: 5 解释: 在 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] 中,我们发现 1 出现了 5 次 (1, 10, 11, 12)(注意11中有两个1)。

    思路:

    计算数字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)

    这道题主要用一般方法,当然暴力是可以的,但是时间复杂度太高

    首先来看一个例子:n=2169,k=1,我们从低位到高位来看:

    首先是个位9: 9前面有216个10,故有216个1,又因为9>1,所以一共有216+1=217个1

    然后是十位6: 6前面有21个100,100中有10个1,故有21*10=210个1,又因为6>1,所以包含了10~19的十个1,一共有210+10=220个1

    然后是百位1: 1前面有2个1000,1000中有100个1,故有2*100=200个1,这里1==1,也就是多了100~169一共69+1=70个1,一共有200+70=270个1

    然后是千位2: 2>1,包含了1000~1999的999+1=1000个1

    一共有 217+220+270+1000=1707个1

    但是k=0时的情况不同,还是以n=2169,k=0为例

    首先是个位9: 不变

    然后是十位6: 6>0,但00~09的情况不存在,结果-10

    然后是百位1: 6>0,但000~099的情况不存在,结果-100

    然后是千位2: 6>0,但0000~0999的情况不存在,结果-1000

    但是0000的情况可以存在 一共有 1737-1110=627种情况

    因此,算法如下 当计算从右往左数第 i位包含 k 的个数时:

    若第i位大于k,则结果为第i位左边所有数字乘以10的i-1次方+10的i-1次方 若第i位小于k,则结果为第i位左边的所有数字乘以10的i-1次方 若第i位等于k,则结果为第i位左边所有数字乘以10的i-1次方+右边的所有数字+1 参考:https://blog.csdn.net/weixin_42316707/article/details/86510114 

    最新回复(0)