One - One Code All

Blog Content

Lintcode-3:统计数字

每日一练 算法 C/C++ LintCode   2010-03-03 23:09:10

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


解答:

当某一位的数字小于i时,那么该位出现i的次数为:更高位数字x当前位数
当某一位的数字等于i时,那么该位出现i的次数为:更高位数字x当前位数+低位数字+1
当某一位的数字大于i时,那么该位出现i的次数为:(更高位数字+1)x当前位数


归纳:
设一个整数为abcdef(六位数),current表示当前正在统计的i位上的数字大小(i=10的话,current=e    i=1000的话,current=c)
before为current之前的所有数字,after为current之后的所有数字(current=d的话,before=abc,after=ef)
举例:534898  current=4  before=53 after=898
从个位开始统计。直到统计完所有位。

int digitCounts(int k, int n) {  
    int current=before=after=0;  
    int i=1,n_count=0;  
    while(n/i!=0){  
        current=(n/i)%10;  
        before=n/(i*10);  
        after=n-n/i*i;  
        if(current>k)  
            n_count=n_count+(before+1)*i;  
        else if(current



上一篇:Lintcode-2:尾部的零
下一篇:Lintcode-4:丑数 II

The minute you think of giving up, think of the reason why you held on so long.