1. 程式人生 > 其它 >leetcode 233. 數字 1 的個數

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; }