參考: https://troywu0.gitbooks.io/interview/整數中出現1的次數(從1到n整數中1出現的次數).htmlhtml
1 public int NumberOf1Between1AndN_Solution(int n) { 2 int count = 0; 3 while (n > 0) { 4 String nStr = String.valueOf(n); 5 for (int i = 0; i < nStr.length(); i++) { 6 if (nStr.charAt(i) == '1') 7 count++; 8 } 9 n--; 10 } 11 return count; 12 }
這種方法的思路簡單,統計每個數中出現1的次數,可以快速寫出代碼。可是,這種方法的時間複雜度很高,O(nlog(n)),面試這麼寫,估計不會留下好的印象。git
1 public int NumberOf1Between1AndN_Solution(int n) { 2 int low = 0, cur = 0, high = 0; 3 int count = 0; 4 int factor = 1; 5 while (factor <= n) { 6 high = n / (factor * 10); 7 low = n % factor; 8 // cur = (n - high * (factor * 10) - low) / factor; 9 cur = (n / factor) % 10; 10 if (cur == 0) 11 count += high * factor; 12 else if (cur == 1) 13 count += high * factor + low + 1; 14 else 15 count += (high + 1) * factor; 16 factor *= 10; 17 } 18 return count; 19 }
這一個思路利用了數字的規律和特色,解決問題的效率很是的高,時間複雜度只與數的位數有關。面試
首先看一個規律:spa
假設有一個四位數,使用 cur 來表示當前位數對應的數值,high表述cur左邊的數,low表示cur右邊的數。會有三種狀況產生:code
根據這一規律,從最低位至最高位,依次求出1出現的次數,最後相加獲得最終的結果。htm