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

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

作者: Tiramisu_b630 | 来源:发表于2019-08-19 16:46 被阅读0次

题目:

输入一个整数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;
    }

相关文章

网友评论

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

      本文链接:https://www.haomeiwen.com/subject/nwlesctx.html