摘要:題目描述求出的整數(shù)中出現(xiàn)的次數(shù)并算出的整數(shù)中出現(xiàn)的次數(shù)為此他特別數(shù)了一下中包含的數(shù)字有因此共出現(xiàn)次但是對(duì)于后面問題他就沒轍了。希望你們幫幫他并把問題更加普遍化可以很快的求出任意非負(fù)整數(shù)區(qū)間中出現(xiàn)的次數(shù)從到中出現(xiàn)的次數(shù)。
題目描述
求出1~13的整數(shù)中1出現(xiàn)的次數(shù),并算出100~1300的整數(shù)中1出現(xiàn)的次數(shù)?為此他特別數(shù)了一下1~13中包含1的數(shù)字有1、10、11、12、13因此共出現(xiàn)6次,但是對(duì)于后面問題他就沒轍了。ACMer希望你們幫幫他,并把問題更加普遍化,可以很快的求出任意非負(fù)整數(shù)區(qū)間中1出現(xiàn)的次數(shù)(從1 到 n 中1出現(xiàn)的次數(shù))。
分析 解法1從1到n依次遍歷,對(duì)于每一個(gè)數(shù)字都檢查一遍它有幾個(gè)1,然后累加即可,時(shí)間復(fù)雜度是O(N*logN)
解法2例如103這樣的數(shù)字:
個(gè)位數(shù)是1的有001,011,021,031,041,051,061,071,081,091,101,共11個(gè)
十位數(shù)是1的有010,011,012,013,014,015,016,017,018,019,共10個(gè)
百位數(shù)是1的有100,101,102,103
所以對(duì)于每一位來(lái)說(shuō),這一位數(shù)字是1的情況是由這一位本身、這一位的所有高位、這一位的所有低位,共同決定的,總結(jié)一下,對(duì)于abXcd來(lái)說(shuō):
X=0時(shí),如果ab=01,那么就有00100~00199這100個(gè)數(shù)字都是X位是1的數(shù)字
X=1時(shí),如果ab=01,那么就有00100~00199這100個(gè)數(shù)字 + ab100~ab1cd這個(gè)cd個(gè)數(shù)字
X>=2時(shí),如果ab=01,那么就有00100~00199這100個(gè)數(shù)字 + 01100~01199這100個(gè)數(shù)字
其實(shí)這道問題在《編程之美》第134頁(yè)有詳解,看不懂可以看看書。
代碼實(shí)現(xiàn)// 解法1 function NumberOf1Between1AndN_Solution(n) { var count = 0; for(var i = 1;i <= n;i++){ var cur = i; while(cur !== 0) { if(cur % 10 === 1) count++; cur = Math.floor(cur/10); } } return count; } // 解法2 function NumberOf1Between1AndN_Solution(n) { var count = 0; var factor = 1; var cur = 0; var high = 0; var low = 0; while(divide(n, factor) !== 0){ low = n - (divide(n, factor))*factor; cur = (divide(n, factor))%10; high = divide(n, factor*10); if(cur === 0) count += high*factor; else if(cur === 1) count += (high*factor + low + 1); else count += (high+1)*factor; factor *= 10; } return count; } function divide(a, b){ return Math.floor(a/b); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96389.html
摘要:使用位運(yùn)算數(shù)組只出現(xiàn)一次數(shù)字的數(shù)組得到最低的有效位,即兩個(gè)數(shù)不同的那一位看完上面的解法,我腦海中只有問號(hào)的存在,啥意思啊下面就讓我們簡(jiǎn)單了解一下位運(yùn)算并解析一下這三道題目。另,負(fù)數(shù)按補(bǔ)碼形式參加按位與運(yùn)算。你可做過這幾道題? 在面試的準(zhǔn)備過程中,刷算法題算是必修課,當(dāng)然我也不例外。某天,我刷到了一道神奇的題目: # 136. 只出現(xiàn)一次的數(shù)字 給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只出現(xiàn)一次以外...
摘要:簡(jiǎn)單介紹一下位運(yùn)算異或運(yùn)算異或邏輯的關(guān)系是當(dāng)不同時(shí),輸出當(dāng)相同時(shí),輸出。另,負(fù)數(shù)按補(bǔ)碼形式參加按位與運(yùn)算。使一個(gè)數(shù)的最低位為零,可以表示為。,截止到這兒,三道題目中使用的位運(yùn)算介紹完畢,那么這里我們插入一下的詳細(xì)題解。你可做過這幾道題? 在面試的準(zhǔn)備過程中,刷算法題算是必修課,當(dāng)然我也不例外。某天,我刷到了一道神奇的題目: # 136. 只出現(xiàn)一次的數(shù)字 給定一個(gè)非空整數(shù)數(shù)組,除了某個(gè)元素只...
摘要:?jiǎn)栴}描述求出的整數(shù)中出現(xiàn)的次數(shù)并算出的整數(shù)中出現(xiàn)的次數(shù)為此他特別數(shù)了一下中包含的數(shù)字有因此共出現(xiàn)次但是對(duì)于后面問題他就沒轍了。希望你們幫幫他并把問題更加普遍化可以很快的求出任意非負(fù)整數(shù)區(qū)間中出現(xiàn)的次數(shù)從到中出現(xiàn)的次數(shù)。 問題描述:求出1~13的整數(shù)中1出現(xiàn)的次數(shù),并算出100~1300的整數(shù)中1出現(xiàn)的次數(shù)?為此他特別數(shù)了一下1~13中包含1的數(shù)字有1、10、11、12、13因此共出現(xiàn)6...
摘要:二維數(shù)組中的查找在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。解法有兩種,一種是遞歸法,一種是迭代法但是遞歸法計(jì)算的時(shí)間復(fù)雜度是以的指數(shù)的方式遞增的,如果面試中千萬(wàn)不要用遞歸法,一定要用迭代法。 二維數(shù)組中的查找 在一個(gè)二維數(shù)組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請(qǐng)完成一個(gè)函數(shù),輸入這樣的一個(gè)二維數(shù)組和...
摘要:算法描述向數(shù)組中輸入元素定義一個(gè)新數(shù)組將數(shù)組中的元素倒序存放將數(shù)組正序輸出,注意結(jié)尾無(wú)空格的格式問題。最后打印出來(lái)數(shù)組中的元素,也就是非共有值,此處注意格式問題。 問題1:將數(shù)組中的數(shù)逆序存放 本題要求編寫程序,將給定的n個(gè)整數(shù)存入數(shù)組中,將數(shù)組中的這n個(gè)數(shù)逆序存放, 再按順序輸出數(shù)組中的元...
閱讀 867·2023-04-26 00:13
閱讀 2986·2021-11-23 10:08
閱讀 2488·2021-09-01 10:41
閱讀 2150·2021-08-27 16:25
閱讀 4262·2021-07-30 15:14
閱讀 2412·2019-08-30 15:54
閱讀 893·2019-08-29 16:22
閱讀 2775·2019-08-26 12:13