整数中1出现的次数(从1到n整数中1出现的次数)【Java版】

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

http://www.nowcoder.com/practice/bd7f978302044eee894445e244c7eee6

方法一:暴力求解

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int count=0;
        for(int i=1;i<=n;i++){//一个一个试
            int j=i;
            while (j!=0){
                if(j%10==1)count++;
                j=j/10;
            }
        }
        return count;
    }
}
//时间O(NlogN) 空间O(1)
//暴力求解进行了大量的重复计算

方法二:找规律

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int count =0;
        for(int i=1; i<=n; i*=10){//i每次*10,而不是+1 //复杂度O(logN) //i=1、10、100...分别对应个位、十位、百位的"1" //包含n(因为每一轮都代表一个数字位,例如10包含个位和十位)
            int a = n/(i*10);//当前位之前的数
            int b = n%i;//当前位之后的数
            int c = (n/i)%10;//当前位
            //整批
            count += a*i;
            //末尾零散
            if(c==1) count += (b+1);
            else if(c>=2) count += i;
        }
        return count;
    }
}//时间O(logN) 空间O(1)
//ps:网上方法,将count+=语句压缩到一行,会严重影响可读性
《剑指Offer-Java题解》 文章被收录于专栏

《剑指Offer-Java题解》

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务