面試題43. 1~n整數中1出現的次數

題目:

面試題43. 1~n整數中1出現的次數
233. 數字 1 的個數
在這裏插入圖片描述

題解:

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

代碼:

public class 面試題43 {

    public static int countDigitOne(int n) {
        int digit = 1; // 位因子(初始化爲:個位)
        int high = n / 10; // 高位
        int cur = n % 10; // 當前位
        int low = 0; // 低位

        int res = 0; // 統計最終的結果

        while(high !=0 || cur != 0) // 當 high 和 cur 同時爲 0 時,說明已經越過最高位,因此跳出
        {
            // 當 cur = 0 時: 此位 1 的出現次數只由高位 high 決定,
            // 計算公式爲:high * digit
            if(cur == 0)
            {
                res += high * digit;
            }
            // 當 cur = 1 時: 此位 1 的出現次數由高位 high 和低位 low 決定,
            // 計算公式爲:high * digit + low + 1
            else if(cur == 1)
            {
                res += high * digit + low + 1;
            }
            // 當 cur = 2, 3, ⋯, 9 時: 此位 1 的出現次數只由高位 high 決定,
            // 計算公式爲:(high + 1) * digit
            else if(cur >= 2 && cur <= 9)
            {
                res += (high + 1) * digit;
            }

            low += cur * digit; // 將 cur 加入 low ,組成下輪 low
            cur = high % 10; // 下輪 cur 是本輪 high 的最低位
            high /= 10; // 將本輪 high 最低位刪除,得到下輪 high
            digit *= 10; // 位因子每輪 × 10
        }
        return res;
    }

    public static void main(String[] args) {
        int res = countDigitOne(32104);
        System.out.println(res); // res == 23626
    }
}

參考:

  1. 面試題43. 1~n 整數中 1 出現的次數(清晰圖解)
  2. java遞歸
  3. C++ 從個位遍歷到最高位依次求解
  4. java 遞歸求解
  5. 數字 1 的個數
  6. 詳細通俗的思路分析,多解法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章