劍指offer 43 1 n整數中 1出現的次數

2021-08-20 15:03:08 字數 2017 閱讀 7774

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

思路1:

算出數字n中1的個數,遍歷1~n,時間複雜度o(nlogn)

**:

class solution 

int number(int n)

return num;}};

思路2:數學規律

<1>1位數情況

這個簡單,如果n = 3,那麼從1到3的所有數字:1,2,3,只有個位數出現1,而且只出現一次。可以發現,n是個位數時,n >=1,那麼f(n)= 1;n = 0,f(n)= 0;

<2>2位數情況

<3>3位數情況

同理分析4位數,5位數。。。。。

設n = abcde ,其中abcde分別為十進位制中各位上的數字。

如果要計算百位上1出現的次數,它要受到3方面的影響:百位上的數字,百位一下(低位)上的數字,百位一上(高位)上的數字。

如果百位上數字為0,百位上可能出現1的次數由更高位決定。比如:12013,則可以知道百位出現1的情況可能是:100~199,1100~1199,2100~2199,,.........,11100~11199,一共1200個。可以看出是由更高位數字(12)決定,並且等於更高位數字(12)乘以 當前位數(100)。

如果百位上數字為1,百位上可能出現1的次數不僅受更高位影響還受低位影響。比如:12113,則可以知道百位受高位影響出現的情況是:100~199,1100~1199,2100~2199,,.........,11100~11199,一共1200個。和上面情況一樣,並且等於更高位數字(12)乘以 當前位數(100)。但同時它還受低位影響,百位出現1的情況是:12100~12113,一共114個,等於低位數字(113)+1。

如果百位上數字大於1(2~9),則百位上出現1的情況僅由更高位決定,比如12213,則百位出現1的情況是:100~199,1100~1199,2100~2199,...........,11100~11199,12100~12199,一共有1300個,並且等於更高位數字+1(12+1)乘以當前位數(100)。

[cpp] 

view plain

copy

/*n = abcde 百位上數字是c

僅以求百位上出現1的情況為例。

*/int

count = 0;  

//百位上數字為0,百位上可能出現1的次數由更高位決定

if(c == 0)  

//百位上數字為1,百位上可能出現1的次數不僅受更高位影響還受低位影響

else

if(c == 1)  

//百位上數字大於1(2~9),百位上出現1的情況僅由更高位決定

else  

[cpp] 

view plain

copy

#include

long

long

intcount(

long

long

intn)  

while

(n / factor != 0)  

//如果為1,出現1的次數由高位和低位決定

else

if(currnum == 1)  

//如果大於1,出現1的次數由高位決定

else

//前移一位

factor *= 10;  

}  return

count;  

}  int

main()  

return

0;  

}  

劍指Offer 43 1 n整數中1出現的次數

輸入乙個整數n,求1 n這n個整數的十進位制表示中1出現的次數。例 輸入12,1 12這些整數中包含1的數字有1 10 11和12,1一共出現了5次。遍歷1 n,每個數字轉換成字串計數1的個數。時間複雜度 o nlogn 空間複雜度 o 1 將1 n分段,分別處理。num n1n 2.n inum ...

劍指offer43 1 n整數中1出現的次數

1 n整數中1出現的次數 這個題目暴力解決貌似可以通過,但時間複雜度太大了。比如數字21345,可以把他分為2段,1 1345 1346 21345 先看1346 21345,因為最高位是2,大於1,因此,只看最高位的話,1出現的次數就是10000 19999,即10000次 看低位,我們發現包括1...

劍指offer 43 1 n整數中1出現的次數

輸入乙個整數 n,求 1 n 這 n 個整數的十進位制表示中 1 出現的次數 例如,輸入12,1 12這些數中包含 1 的數字有 1 10 11 12,其中 1 一共出現了5次 暴力解法 class solution return res 利用數學公式計算 首先 依次類推,從 1,10i 1,10 ...