求出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 ...