算法——1~n 整数中 1 出现的次数

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

解题思路:依次遍历每一个位的情况。即统计,小于当前数字的数中,每一个位为1的数量。

在这里插入图片描述

  • 当前位是0:则不存小于去掉高位,当前位还有1存在的情况,所以,只需要统计高位存在的时候,当前位存在1的情况。至于为什么是加上高位的数字值,因为当前位为1的是的数量就是高位的数值啊。
  • 当前位是1:首先可以加上当前位是0的情况高位的值,因为当前为是0肯定小于是1的情况。然后加上低位的值,原理和上面一样。至于为什么要加1,就是加上了当前位为1,高位的值为0的情况。
  • 当前位大于1:数量只由高位决定,因为在当前位是1的情况下,低位可以填满,填满了都不会大于整体的数值,而上面一种情况,不能填满,填满了就超了。
class Solution {
    public int countDigitOne(int n) {
        int res = 0;
        long i = 1;
        while(n / i > 0) {
            long high = n / (i * 10);
            long cur = (n / i) % 10;
            long low = n - high * 10 * i - cur * i;

            if(cur == 0) res += high * i;
            else if(cur == 1) res += high * i + low + 1;
            else res += high * i + i;

            i *= 10;
        }

        return res;
    }
}
posted @ 2020-11-12 16:53  lippon  阅读(172)  评论(0编辑  收藏  举报