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

2021-10-05 22:08:25 字數 1104 閱讀 6291

求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?為此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數(從1 到 n 中1出現的次數)。

考察點:數學思維,發散思維。

思路1:參考討論區,暴力破解。把所有數字轉成字串,再進行字串單個查詢,複雜度較高但是可行。

class solution

};思路2:分別判斷乙個數字有多少個1,進行迴圈累加。複雜度為o(nlogn) 複雜度較高。

class solution

return number;

}int numberof1between1andn_solution(int n)

return count;}};

假設n=abcde,都是十進位制的數字。如果計算百位上的數字,受到三方面因素。百位數字,百位之前的數字,百位之後的數字。

1.如果百位上是0的話,那麼出現1的次數由百位之前的數字決定。比如15012,百位上出現1的情況是(00)100-199,(0)1100-1199,..10100-10199...14100-14199,從0到14,總共是15個,每段對應的是100個數。那就是15*100。

2.如果百位上是1的話,那麼出現1的次數由百位之前的數字和百位之後的數字決定,比如15112,除了上面分析的那些(00)100-199,(0)1100-1199... 14100-14199這15*100個數之外,還多了15100-15112,這些是113個數字,也就是百位之後的數字+1.

3.如果百位上的數字大於1的話,那麼出現1的次數由百位之前的數字決定,比如15212,那麼除了上面分析的那些(00)100-199,(0)1100-1199... 14100-14199這15*100個數之外,還多了15100-15199,相當於是(15+1)*100個數字。

class solution

else if (current == 1)

else

count += (before + 1) * i;

i = i * 10;//i往前進製

}return count;

}

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

輸入乙個整數n,求1 n這n個整數的十進位制表示中1出現的次數。例如,輸入12,1 12這些整數中包含1的數字有1 10 11和12,1一共出現了5次。對於乙個數,每次對10取餘判斷最低位是不是1,就可以得到這個數中1的數量,從1遍歷到n,每個數都這麼做,就可以得到1的總數量了。看劍指offer上的...

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

輸入乙個整數 n 求1 n這n個整數的十進位制表示中1出現的次數。例如,輸入12,1 12這些整數中包含1 的數字有1 10 11和12,1一共出現了5次。示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 6 限制 1 n 2 31 思路 遞迴。將數字分為最高位和後幾位。當數字由1...

43 1 n 整數中 1 出現的次數

輸入乙個整數n,求1 n這n個整數的十進位制表示中1出現的次數。例如,輸入12,1 12這些整數中包含1的數字有1 10 11和12,1一共出現了5次。示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 6 限制 1 n 2 31注意 本題與主站 233 題相同 最直觀的做法,就是累...