[Lintcode] 3 统计数字
计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值。
描述
计算数字 k 在 0 到 n 中的出现的次数,k 可能是 0~9 的一个值。
样例
1 |
|
1 |
|
思路
以k = 5为例:
每10位产生1个数,[0,9]有一个5,[10,19]有一个15,[20,29]有一个25
每100位产生10个数,[0,99]有10个5,即[50,59],[100,199]有10个5,即[150,159]
每1000位产生100个数,[0,999]有100个5,即[500,599]
以此类推……
当 n = 2169,k = 1 时:
个位:9前面有216个10,故有216个1,又因为9>1,所以一共有216+1=217个1
十位:6前面有21个100,100中有10个1,故有21*10=210个1,又因为6>1,所以包含了10~19的10个1,一共有210+10=220个1
百位:1前面有2个1000,1000中有100个1,故有2*100=200个1,这里1==1,也就是多了100~169一共70个1,一共有200+70=270个1
千位:2>1,包含了1000~1999的1000个1
一共有217+220+270+1000=1707个1
但当 k = 0 时的情况不同,当 n = 2169,k = 0 时:
个位:9前面有216个10,故有216个0,又因为9>0,所以一共有216+1=217个0
十位:6前面有21个100,100中有10个0,故有21*10=210个0,但00到09的情况不存在,故只有210-10=200个0,又因为6>0,所以包含了00到09的10个0,一共有200+10=210个0
百位:1前面有2个1000,1000中有100个0,故有2*100=200个1,但000到099的情况不存在,故只有200-100=100个0,这里1>0,所以包含了000到099的100个0,一共有100+100=200个0
千位:2>0,但0000到0999的情况不存在
一共有217+210+200=627个0
因此,当计算从右往左数第 i位包含 k 的个数时:
若第 i 位大于k,则结果为**第 i 位左边所有数字乘以10i-1次方 **+ 10i-1次方
若第 i 位小于k,则结果为第 i 位左边的所有数字乘以10i-1次方
若第 i 位等于k,则结果为**第 i 位左边所有数字乘以10i-1次方 **+ 右边的所有数字+1
代码
1 |
|
参考
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!