面试题43(剑指offer)--1~n整数中1出现的次数

题目:

输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。

思路:

从最低位到最高位分开计算。

假如要计算百位上1出现的次数由高位的数字,低位的数字,百位以上的数字。

  1. 若百位上数字为0,百位上可能出现1的次数由高位决定。比如:2013,百位出现1的情况:100199,11001199,一共200个。结果等于更高位数字乘以当前位数。即2*100 。
  2. 如果百位上数字为1,百位上可能出现1的次数受高位和低位影响。比如:2113,受高位影响的情况是:100199,11001199,21002113。等于高位数字乘以当前位数2*100。受低位影响,百位出现1的情况是:21002113,一共114个,等于低位数字113+1。
  3. 如果百位上数字大于1,则百位上出现1的情况仅由更高位决定,比如2213,则百位出现1的情况是:100199,11001199,2100~2199,等于高位数字+1乘以当前位数(2+1)*100。

代码:

public static int NumberOf1Between1AndN_Solution(int n) {
        int count = 0;
        for (int i = 1; i <= n; i *= 10) {  //i代表位数
            int high = n / (i * 10); //更高位数字
            int low = (n % i);  //更低位数字
            int cur = (n / i) % 10;  //当前位数字
            if (cur == 0) {
                count += high * i;
            } else if (cur == 1) {
                count += high * i + (low + 1);
            } else {
                count += (high + 1) * i;
            }
        }
        return count;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值