題目:
面試題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
}
}