JAVA-JZ31计算1到n中1出现的次数

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

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

算法最后呈现得结果就是把n分成两部分来计算以145和245来做例子理解,讲145分成1到45,46到145来计算。
核心过程就是

  • 1.计算最高位为1的

  • 1.1如果首位为1,最高位为1有余数+1种可能,100,101...145

  • 1.2如果首位不为1,最高位为1有分位数(不知道如何描述10的(len-1)次幂)种可能,就100,

  • 2.计算其它位位1

  • 145除去首位百位还有个位十位(46到145),这两个坑随便选一个给1占着,还剩len-1-1个坑位,有0到9十种可能.十位为1 ,110,111,..119(0到9),个位为1,有51,61,71,81,91,101,111,121,131,141(0到9)
    1,2,想加加上NumberOf1Between1AndN_Solution(45)

    public class Solution {
    
     public int NumberOf1Between1AndN_Solution(int n) {
    
    
    if(n == 0){
        return 0;
    }
    String str = ""+n;
    int len = str.length();
    if (len == 1){
        return 1;
    }
    int res = (int)Math.pow(10,len-1);
    int firstNumber = n/res;
    int mod =n%res;
    int firstBit = firstNumber == 1 ? mod+1:res;
    int otherBit =(len-1)*firstNumber*res/10;//1的位置(len-1);每个位置都有(len-2)个位数的可能,重复了高位数可能
    return firstBit+otherBit+NumberOf1Between1AndN_Solution(mod);//分成1-->mod 和mod+1-->n两部分来计算

}

}
```

全部评论

相关推荐

不愿透露姓名的神秘牛友
07-07 12:04
毕业生招你惹你了,问一个发薪日来一句别看网上乱七八糟的你看哪个工作没有固定发薪日扭头就取消了面试就问了一句公司都是这个态度吗还搞上人身攻击了...
程序员小白条:呃呃呃,都还没面试,我都不会问这么细,何况通不通过,去不去都另说,你没实力和学历的话,在外面就这样,说实话没直接已读不回就不错了,浪费时间基本上
点赞 评论 收藏
分享
05-29 09:02
门头沟学院 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务