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

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

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

这道题思路很简单,就是处理情况的时候容易出错。
思路:
求每位出现1的次数,然后相加即可。
现在问题变成如何求每一位出现1的次数。

以23145为例
定三个变量:
假如当前求的是十位上1出现的次数,那么:
高位:231
低位:5
当前值:4
我们只需要想当前值为1的时候,高位和低位有多少选择。
因为当前值4>1,所以高位可取0~231,低位可取0~9.
所以十位上1出现的次数就是232*10;

特殊情况就是当前位是1的时候,
这时候当高位取最大值的时候,低位只能取0~低位最大值。
高位取其他值的时候,按上面的计算就行。
以上面的百位为例:
高位:23
当前:1
低位:45
百位出现1的次数=23*100+(45+1)

当当前位为0的时候,最高位可取0~(最高位-1),低位可取0~(当前求的位数值-1),相乘即可。

代码:

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        int count=0;
        int high;
        int low;
        int prelow=0;
        for(int i=1;i<=n;i=i*10){//i记录当前是多少位
            high=n/(i*10);
            low=n%(i*10)/i;
            if(i>=10){//当前位非个位的时候才有低位
                 prelow=n%i;
            }
            if(i==1){//当前位为个位的时候
                if(low>=1){
                    count=high+1;
                }else{
                    count=high;
                }
            }else{
                if(low==1){
                    count=count+high*i+prelow+1;
                }else if(low>1){
                     count=count+(high+1)*i;
                }
                else{
                    count=count+high*i;
                }
            }      
        }
        return count;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务