算不上什么简单的方法但是绝对好理解

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

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

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
        if(n<1)
            return 0;
        if(n<10)
            return 1;
        int result=0;
        int i=1;
        int num=n;
        while(true){
            int a=new Double(Math.pow(10,i)).intValue();
            int resi=n%10;
            n=n/10;
            if(resi>1){
                result+=(n+1)*a/10;
            }else if(resi==1){
                result+=(n-1)*a/10+num-n*a+1;
            }else{
                result+=n*a/10;
            }
            if(n==0){
                return result;
            }
            i++;

        }

    }
}
我的思路就是看每一位计算每一位出现1的次数再加起来就行,判断每一位还是通过不断取余,10,100,1000这样,也许有更方便的办法但是懒得想了。
之后对于每一位出现1的次数就是分三种情况
1.非1非0
那么出现次数显而易见是当前的(商+1)*位数。比如果21305中3这一位,它出现1的话连续出现会出现100次就是A1B,那么前面的A每加1,意味着后面已经改变了1000次,在这1000次中只有连续的100次百位是1。而出现了几次100次?当然就是A+1次,因为要从0开始计数。所以百位出现1的次数是22*100=2200;
2.该位是0
那么出现次数就是当前的商*位数。比如果21305中的十位,具体分析和上面差不多,只是因为要从0开始计数一直到212,因为213后面还没有到1所以不用考虑。那么十位的出现1的次数就是213*10=2130;
3.该位是1
那么出现次数就是当前的商*位数+1后面的数+1。比如果21305中的千位,具体分析也和上面差不多,因为要从0开始计数一直到2,所以是2*1000,但是以2开头千位为1的数并没有走完,只走了305+1(同样从0开始),因此这一位是2*1000+306=2306

总结:以21305为例那么最后的值应该是1*10000+(2*1000+306)+22*100+213*10+2131*1=18767

全部评论

相关推荐

11-02 09:49
已编辑
货拉拉_测试(实习员工)
热爱生活的仰泳鲈鱼求你们别卷了:没事楼主,有反转查看图片
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务