面試題:4億裡有多少個1(11算2個)。

來源:互聯網
上載者:User

乍看這題真夠唬人的,群裡看到這個題目後爭先恐後的說看法。最簡單的辦法不外乎就是遍曆每個數,然後toString() 看看裡面有多少個1,最後全部加起來,這是我們得到標準答案的辦法。

群裡算上我3個人寫了3個笨方法都跑出來了,3個笨方法,呵呵 有意思,笨方法也不一樣。 程式的實現真是變幻莫測。

var re = /1{1}/g;var max = 4 * 10000 * 10000;getTotal(f);getTotal(f1);getTotal(f2);function getTotal(func){    var total = 0;    var begin = new Date();    for(var i= 1 ;i <= max;i++)    {        total += func(i);    }    var end = new Date();    var timespan = end - begin;    alert("開始時間:"+begin + "\n 結束時間:"+end +"\n總耗時:"+timespan + "毫秒 \n 總數:"+total);}function f(num){    var t = 0;    while(num)    {        if(num < 10){ if(num==1)t++;break;}        var i = num % 10;        if(i == 1) t++;            num = parseInt(num / 10);    }    return t;}function f1(num){    var str = num.toString()    var t = 0;    for(var i=0;i<str.length;i++)    {        if(str.charAt(i)=="1") t++;    }    return t;}function f2(num){    var str = num.toString();    var t = 0;    while(re.exec(str))    {        t++;    }    return t;}

當數量少的時候第一種最快,顯然嘛,沒有處理字串的步驟。按理說數量越大他越有優勢。 可是實測結果,3個都差不多。但是用C#跑的話,第一個明顯越來越有優勢。。。。

但是出題人肯定不是這樣想的,很多人都在說自己的技巧與看法,我也思考了很久。 

先拿 100來說 ,100裡面有多少個1?  

10
11
12
13
14
15
16
17
18
19
01
11
21
31
41
51
61
71
81
91

故意這麼排列是我們可以把 0~99看作是 1個長度為2的數組,  1位為1時,2位的可能性是10,2位為1時1位的可能性為10,所以 0~99應該有20個1,而100有1個所以是21個。

999就應該是   1*10*10 + 10*1*10 + 10*10*1 = 300

400呢? 因為首位只能出現0~3 ,所以應該是 1*10*10 + 4*1*10 + 4*1*10

4 0000 0000 應該是 1 * (10^8) + 4*(10^7) * 8 = 420000000

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.