在1 n中1出現的次數(微軟等IT公司面試一百題)

2021-06-07 07:16:18 字數 1039 閱讀 7199

因為自己想的思路和網路上廣泛的思路不一樣,所以寫一下我的思路,驗證結果是正確的

題目如下:輸入乙個整數n,求從1-n這n個整數的十進位制表示中1出現的次數,例如輸入12,從1到12這些整數中包含1的數字有1,10,11,12, 1 一共出現了5次。

(google面試題目)

用兩個數字簡述我的思路 例如輸入為 7111

從1-7111可以分解成1-6999 和 111

這個數字的第乙個數是7 大於1,所以從1000-1999這些數字裡都多了乙個1

所以numofones(7111) = numofones(111) + 7 * numofones(999) + 1000

之後求811和999可以用遞迴的方法。

不過需要注意的是,當第乙個數字為1的時候,例如111,演算法要執行另外乙個分支

111可以分為1-99,100-111,100-111裡面含有的1個個數是 (111-100 + 1) + numofones(11)

所以最後演算法寫成

numofones(111) = numofones(99) + 111 - 100 + 1 + numofones(11)

最後寫程式如下: 

void parsenumber(int num, int &ndigits, int &nfirst, int ¬hers, int &nmaxdigits)

nfirst = num;

nmaxdigits = pow(10.0,ndigits) ;

nothers = orignum - nmaxdigits * nfirst;

nmaxdigits -= 1;

}int getnumofones(int n)

if( n < 10 )

int ndigits, nfirst, nothers, nmaxdigits;

parsenumber(n, ndigits, nfirst, nothers, nmaxdigits);

if( nfirst == 1)

else

}

1 n中1出現的次數

輸入乙個整數 n 求1 n這n個整數的十進位制表示中1出現的次數。例如,輸入12,1 12這些整數中包含1 的數字有1 10 11和12,1一共出現了5次。示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 6 解析需要通過找規律來分析。假設我們對5014這個數字求解。1 個位上1出...

1 n整數中1出現的次數

示例 1 輸入 n 12 輸出 5 示例 2 輸入 n 13 輸出 62.1 思路分析 題目要求1 n中1出現的次數,考慮將n轉換為字串,然後統計字元1的個數,但這樣會超時 既然1不行,換一種思路,將n轉換為字串後,可以容易確定n的位數 利用for迴圈,從個位開始直到最高位,計算每一位上1出現的次數...

1 n 整數中1出現的次數(21)

方法一 將每個數字中的1的個數進行相加,最終的結果就是1出現的總的次數。但是這種方法的效率較低,時間複雜度為 o n log n o n log n o n lo gn 當n非常大的時候,需要大量的計算。class solution return sumofone int numofone int ...