剑指offer——第31题:整数中出现1的次数

求从1 到 n 的整数中1出现的次数。

思路:

  • 5246,先是个位6,个位的变化范围是0~9,而这样的变化,会有524次,所以这里有524个1,又因为最后一次有个6,所以还要加一次,所以个位的1的个数是524+1 = 525;
  • 再看十位,十位上的数字是4,所以同理,这个位数的上的1的个数应该是52 * 10,注意这里不是52 * 1,因为,10位上的数后面10-20之间有10个1,且最后4>1,所以还要加上10,所以十位上的1的个数是52 * 10+10 = 530。这里要注意如果十位上的数字是1的话,就要看个位上的数是多少了,也就是10 ~ 20之间取多少个,这时候我们只要计算n%10+1就行了。
  • 然后同理推高位,可以得到1~5246中1的个数是(524 * 1+1)+(52 * 10+10)+(5 * 100+100) +( 0 * 1000+1000) = 2655个。
public class T_31_NumberOf1Between1AndN {
    public int NumberOf1Between1AndN_Solution(int n) {
        if (n <= 0) {
            return 0;
        }
        int res = 0;
        // base表示当前判断的位数、cur表示当前位、height表示高位
        int base = 1;
        int cur;
        int height = n;
        while (height > 0) {
            cur = height % 10;
            height /= 10;
            res += height * base; //先加上一开始的
            if (cur == 1) { //如果是计算2的出现次数,此处就改为2
                res += (n % base) + 1; //==1 就要看前面的了
            } else if (cur > 1) { //如果是计算2的出现次数,此处就改为2
                res += base; //后面剩的,>1 还要+base
            }
            base *= 10;
        }
        return res;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值