今天小菜無意間在社群看到乙個討論:「0~400中1出現了多少次?」。
小菜看到大部分網友給出的演算法是基於字串的處理,思路大致是:把所有數字拼接成乙個字串,然後對字串進行處理,進而獲取出現次數。例如以下**:
1/**2* 網友版本
3* 找出"1"出現的次數4*
*/5function
numbercount1(n)
10var s = a.join('');
11return (s.length - s.replace(/1/g, '').length);
12 }
也有高手用位運算處理,無奈太高深,小菜看不懂~~~
其實如果只考慮400這樣規整的整數,是有規律可循的,小菜給出乙個通過計算得出出現次數的版本:
/*** 小菜的版本
* 找出"1"出現的次數
* 只可以判斷除了最高位,其它位全是0的整數。例如1、10、20、400、5000。**/
function
numbercount(n)
if(_s === 1)
count = count + (_w/10)*_s*_z;
return
count;
}
通過字串處理,當範圍比較小的時候,速度、資源消耗還是可以接受的,但是如果數量級比較大,比如0~400000000,用字串處理,顯然效率太低,經過測試,瀏覽器頁面直接崩潰。
而用小菜給出的演算法,計算0~400000000範圍內1出現的次數,平均耗時15毫秒左右,但小菜這種演算法,只能處理除了最高位,其它位全是0的整數。例如1、10、20、400、5000。
小菜寫這篇文章,不是為了炫耀自己的演算法,而是要感謝社群的積極討論,討論不僅讓我們思路開闊,更讓我們變得善於思考。
數1 n個數中0 9出現過多少次
最初的問題是這樣的 提示 n通過引數傳入 思路出爐的時候可以順便 或者必須 其他幾個數出現的次數一併求了,所以就設計了這樣的程式 include int main printf please input a number scanf d n for i n i 0 i printf d n a 9 ...
題7 出現K次與出現1次
題目描述 乙個陣列中只有乙個數出現了1次,其他的數都出現了k次,請輸出出現了1次的那個數。原理 k個相同的k進製數之間做不進製的加法,結果為0,如,2個2得0 10個5得0 解題思路 將所有的數轉化成為k進製,然後做k進製的不進製加法運算,得出的結果再有k進製轉換位10進製。解題步驟 第一步 建立乙...
整數中1出現的次數(從1到n整數中1出現的次數)
求出1 13的整數中1出現的次數,並算出100 1300的整數中1出現的次數?為此他特別數了一下1 13中包含1的數字有1 10 11 12 13因此共出現6次,但是對於後面問題他就沒轍了。acmer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。include u...