輸入乙個整數 n,求 1~n 這 n 個整數的十進位制表示中 1 出現的次數
例如,輸入12,1~12這些數中包含 1 的數字有 1、10、11、12,其中 1 一共出現了5次暴力解法
class solution
}return res;
}};
利用數學公式計算
首先:
依次類推,從 [1,
10i)
[1,10^i)
[1,10i
) 中,在它們次高位中,任意 x
xx 出現了 10(
i−1)
10^10
(i−1
) 次以 2593 ,x=5 為例,從1 到 2593 中,數字 5 出現了813 次,其中個位、十位、百位
個
位\color個位
個位從1到2593中,包含了259個10,因此任意乙個 x 都出現了 259 次
最後剩下2591、2592、2593 最大的個位 3 < x , 因此不包含任何5
十
位\color十位
十位從1到2500中,包含了25個100,因此任意乙個 x 都出現了25*10=250次
剩下2501到2593,最大的十位 9 > 3 ,因此包含10個5
250 + 10 = 260
百
位\color百位
百位從1到2000中,包含2個1000,因此任意乙個 x 都出現了 2*100=200次
最大位百位 5== x,是2500 到 2593 ,是93+1=94
200 + 94 = 294
千
位\color千位
千位沒有更高位
最大位千位 2<5 ,不會有任何5
總結
計算第 i 位包含的 x 個數時
取第 i 位的高位【$ n%10^i $】 得到基礎值 a
取第 i 位數字,計算修正值
// 計算數字 x 在 1-n **現的次數。
int count(int n, int x)
else if (cur == x)
}return cnt;
}
i=1 k=n/i=2593
k/10 = 259 高位
k%10 = 3 當前位
i=10 k=n/i=259
k/10 = 25
k%10 = 9
i=100 k=25
k/10=2
k%10=5
n-k*i + 1 = 2593-2500+1=94
n%i +1 = 93+1=94
i=100 k=2;
k/10=0;
k%2=2;
class solution
return cnt;
}};
計算1至n中數字x出現的次數 劍指offer 43 1 n整數中 1出現的次數
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。思路1 算出數字n...
劍指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...