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

2021-10-06 20:43:20 字數 1627 閱讀 2765

輸入乙個整數 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...