leetcode 233 number of digit one

假設 n = xyzdabc,此時我們求千位是 1 的個數,也就是 d 所在的位置。

那麼此時有三種情況,

  • d == 0,那麼千位上 1 的個數就是 xyz * 1000
  • d == 1,那麼千位上 1 的個數就是 xyz * 1000 + abc + 1
  • d > 1,那麼千位上 1 的個數就是 xyz * 1000 + 1000

 代碼如下:

public int countDigitOne(int n) {
    int count = 0;
    //依次考慮個位、十位、百位...是 1
    //k = 1000, 對應於上邊舉的例子
    for (int k = 1; k <= n; k *= 10) { 
        // xyzdabc
        int abc = n % k;
        int xyzd = n / k;
        int d = xyzd % 10;
        int xyz = xyzd / 10;
        count += xyz * k;
        if (d > 1) {
            count += k;
        }
        if (d == 1) {
            count += abc + 1;
        }
        //如果不加這句的話,雖然 k 一直乘以 10,但由於溢出的問題
        //k 本來要大於 n 的時候,卻小於了 n 會再次進入循環
        //此時代表最高位是 1 的情況也考慮完成了
        if(xyz == 0){
            break;
        }
    }
    return count;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章