因為自己想的思路和網路上廣泛的思路不一樣,所以寫一下我的思路,驗證結果是正確的
題目如下:輸入乙個整數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 ...