剑指43_1~n整数中1出现的次数

public class Solution {
    public int NumberOf1Between1AndN_Solution(int n) {
		int count=0;
        int i=1;
        int current=0;//定义当前位数字
        int low=0;//定义低位数字
        int high=0;//定义高位数字
        while(n/i!=0)//每次将数字n从低位向高位移动,计算每一位可能出现的1的次数
        {
            //current当前位的数字,low是当前位后面的所有数字,high是当前位前面的所有数字
            current=(n/i)%10;//当前位的数字是除i得到当前指向的数字前面所有数,然后%10得到最后一位数字
            low=n-(n/i)*i;//取低位数字,n/i表示取当前位数的及前面所有高位,在*i将后面位全都补0
            high=n/(i*10);//向前去高位数字,将i再乘以10得到取高位数字n/(i*10)
            if(current==0){//当前位数0则当前位出现1的个数与高位有关
                count+=high*i;
            }else if(current==1){//当前位数为1,则当前位出现1的个数等于高位*i加低位+1
               count+=high*i+low+1; 
            }else{//如果当前数大于等于2,则1的个数等于(高位+1)*i
                count+=(high+1)*i;
            }
            i*=10;
        }
        return count;
        
    }
}

采用编程之美的方法,从低位向高位移动,计算每一位会出现1的次数。

当前位出现的1的次数与低位和高位有关,

如果当前位等于0,则当前位出现1的次数只与高位有关,比如12013,百位上出现1的次数100~199,1100~1199,2100~2199,3100~3199,4100~4199....11100~11199。因为当前位为0,说明高位肯定有数字,所以当前位1出现的次数与高位有关。以1013百位为例,高位为1则代表只能取到100~199。


如果当前位为1,当前位出现的次数与高位和低位有关,12113同样的百位出现1的次数100~199,1100~1199,2100~2199,...11100~11199,但是针对大于11199的情况。12100~12113有14个1为低位数字+1.


如果当前位大于1,则当前位出现的次数只能高位有关,12213同样的百位出现1的次数100~199,1100~1199,2100~2199,...11100~11199,并加上12100~12199。


n/i是去当前位置的数包含高位,去除低位,12113/100=121

计算当前位的数字current=(n/i)%10,%10是取最后一位数


取低位数字n-(n/i)*i,(n/i)*i,将低位全部变0,变为12100


取高位数字n/(i*10),向高位取数字


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值