leetcode 233. 数字 1 的个数

给定一个整数 n,计算所有小于等于 n 的非负整数中数字 1 出现的个数。

 

示例 1:

输入:n = 13
输出:6
示例 2:

输入:n = 0
输出:0
 

提示:

0 <= n <= 2 * 109

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-digit-one
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

数组存储每个数量级1的个数

1:按照各个数量级,创建两个树,nums数组来记录每个数量级, arr数组来记录每个数量级中1的个数。

2:拿到n之后,就从高位到地位的计算其1的个数。

3:需要注意的是,1需要单独处理一下。

当每一位的数字 大于 1 的时候,就说明,此数量级中包含了 nums[i] 个1 了 ,

例如 567 ,百位是 5 大于 1,说明 100-199中,包含了100个1.200-999中没有百位的1.

例如 167 ,百位是 1 等于 1, 说明 有 100-167 共 68个1在百位上。

    public int countDigitOne(int n) {
        int sum = 0;
        if (n == 1000000000) {
            n--;
            sum++;
        }
        int[] arr = {0, 1, 20, 300, 4000, 50000, 600000, 7000000, 80000000};
        int[] nums = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
        int length = String.valueOf(n).length();
        for (int i = length - 1; i > 0; i--) {
            int m = n / nums[i];
            n = n % nums[i];
            sum = sum + m * arr[i];
            if (m > 1) {
                sum = sum + nums[i];
            } else if (m == 1) {
                sum = sum + n + 1;
            }
        }
        if (n >= 1) {
            sum++;
        }
        return sum;
    }

leetcode 233. 数字 1 的个数

leetcode 233. 数字 1 的个数

上一篇:关联多个Git仓库


下一篇:codesys-FB块