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

2021-09-11 22:10:16 字數 2289 閱讀 3797

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

這個題目暴力解決貌似可以通過,但時間複雜度太大了。

比如數字21345,可以把他分為2段,1-1345    1346-21345

先看1346-21345,因為最高位是2,大於1,因此,只看最高位的話,1出現的次數就是10000-19999,即10000次

看低位,我們發現包括1346-9999 0000-9999 0000-1345這3部分,其實也就是求2個 0000-9999中1出現的次數,我們可以總結規律:

在4位數中,任選一位是1,其餘三位可以在0-9這10個數字中任意選擇,因此根據排列組合的原理,出現的次數為4*10^3=4000,再乘以2即800。至於為什麼可以用排列組合,可以這麼考慮:任選的一位比如1000,即選擇第一位即千位是1,那麼千位是1的數字個數為10^3,那麼如果任選的是百位,那麼百位是1的個數也是10^3,依次共有4中選擇,所以10^3.

至於1-1345**現的次數,可以用遞迴來解決。

因此,這可以看作乙個遞迴問題

char strn[50];

int numberof1(const char *s)

int numberof1between1andn_solution(int n)

strn[i]='\0';

int k=0,m=i-1;

while(k這一版思路比較清晰。

比如數字13524。

我們可以考慮百位,百位是5,大於等於2,那麼百位是1的數就有100-199,1100-1199,2100-2199,3100-3199 ......10100-10199,11100-11199,12100-12199,13100-13199,則百位共有(13+1)*100個1,13是百位前的數字

再看數字13110

考慮百位,百位是1,小於2,那麼百位是1的數就有100-199,1100-1199,2100-2199,......10100-10199,11100-11199,12100-12199,13100-13110,則百位共有13*100+10+1個,13是百位前的數字,10是百位後的數字

再看數字13011

百位是0,那麼百位是1的數字有100-199,1100-1199,2100-2199......10100-10199,11100-11199,12100-12199,則百位共有13*100個1,13是百位前的數字。

因此,某位上出現1的次數可能會受到該位高位數字和低位數字的影響。

int numberof1between1andn_solution(int n)

else if(current==1)

numof1+=before*i+after+1;

else

numof1+=before*i;

i=i*10;

}return numof1;

}

注意怎麼計算高位低位(不一定是單位數)和當前位(是乙個0-9的數字)

最簡單的方法

對於數字3141592

先看個位數,為2,大於1,那麼置個位數為1,前邊的數字可以從0-314159之間隨意排列,所以共有314160種可能(即個位數為1的情況數)

再看十位數,為9,大於1,那麼置十位數為1,前面的數字可以從0-31415之間隨意排列,十位數後面的數字也可以選擇0-9,因此共有314160種可能。

再看百位,為5,大於1,置百位為1,前面的數字從0-3141之間隨意排列,百位後面的數字也可以從0-99,因此共有314200種可能

再看千位,為1,比較特殊,雖然前面的數字可以從0-314之間隨意排列,但當是314時,後面的範圍只可以時0-592,當為0-313時,後面的範圍可以是0-999因此需要分開,即314*1000+593=314593

後面依次。。。

由於當某一位數字大於等於2時,該位為1時出現的情況不需要特殊處理,(該位前的數字+1)*位數值即可

當某一位數字小於2時,該位為1時出現的情況需要進行處理,即(該位前的數字)*位數值+(該位後的數字+1)*t(當該位數字為1時t=1,為0時t=0)

那如何判斷大於還是小於2,可以採用加8看是否進製即可,如果進製,說明大於等於2,按照進製後的資料乘以位數值即可,如果沒有進製,處理完前段再處理後段即可(處理後段時需要判斷該位是為0還是為1)

int numberof1between1andn_solution(int n)

return numof1;

}

劍指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 ...

劍指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 ...