leetcode 233. 數字 1 的個數
阿新 • • 發佈:2021-08-13
給定一個整數 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; }