从1到n整数中1出现的次数

题目描述:

求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。

思想:

第一种比较容易理解的方法:时间复杂度是O(nlogn)

从1到n开始循环,对每一个数字都检查是否出现1,方法是:首先对这个整数做模10的运算(判断是否个位是1,比如121),余数如果是1(121%10 = 1),就让count++,然后整数再除以10(得到12),继续做模运算(12%10=2    !=    1),再除以10,得到1,做模运算,(1%10=1),121这个数就结束了

public int NumberOf1Between1AndN_Solution(int n) {
    int count = 0;//表示从0到n中出现1 的整数的个数
    for(int i=1; i<=n; i++){
    int t=i;
//	对这个整数%10,得到余数,如果是1,则count++
    while(t != 0){
        if(t%10==1)
            count++;
       t = t/10;
    }
    }
return count;
}

第二种参考网上,几行代码解决,复杂度O(logn)

博客的链接 https://www.cnblogs.com/xuanxufeng/p/6854105.html#undefined

/**
* 第二种方法
* n/m就是a,n%m是b
* 对于11189,a是111,b是89
*/
public int NumberOf1Between1AndN_Solution(int n) {
    int count = 0;
    for(long m=1; m<=n; m*=10){
        count += (n/m + 8)/10 * m + ((n/m)%10==1 ? n%m + 1 : 0);
        }
    return count;
}


猜你喜欢

转载自blog.csdn.net/weixin_38108266/article/details/80759227