国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

微軟算法100題30在從1到n的整數(shù)中1出現(xiàn)的次數(shù)

2019-11-14 15:16:28
字體:
供稿:網(wǎng)友

30. 在從1到n的整數(shù)中1出現(xiàn)的次數(shù)
題目:輸入一個整數(shù)n,求從1到n 這n個整數(shù)的十進(jìn)制表示中1出現(xiàn)的次數(shù)。
例如輸入12,從1到12這些整數(shù)中包含1的數(shù)字有1,10,11 和12,1 一共出現(xiàn)了5 次。
分析:這是一道廣為流傳的google 面試題

 

思路:

第一反應(yīng)是遍歷這N個數(shù),然后對每個正數(shù)n不斷用10取余來求各個位上1的次數(shù),同理對每個數(shù)求1出現(xiàn)的次數(shù)并累加,但這種方法的時間復(fù)雜度是o(n),當(dāng)n值很高時耗時太久

第二個思路是能不能通過數(shù)學(xué)的方法找到n上所有1的次數(shù) (自己實在是想不出來,先從網(wǎng)上搜了一下,最后發(fā)現(xiàn)還是編程之美上講的最清楚,這里我試圖用自己的語言來總結(jié)一下)

首先是一個重要的規(guī)律:對于特定的數(shù)n, 所有從1到n上出現(xiàn)1的次數(shù)肯定等于個位上1的次數(shù)+十位上1的次數(shù)+百位上1的次數(shù)+千位上1的次數(shù)..... 比如

f(3)=1 只有個位上出現(xiàn)1 

f(13)=個位上出現(xiàn)1的有1 11, 十位上有10 11 12 13  = 2 + 4

f(23)=個位11的數(shù)量 11 21, 十位上有10 11 12 13 ...19 = 3 + 10

f(33)=個位1的數(shù)量 11 21 31, 十位上有10 11 12 13...19 = 4 + 10

f(93)=個位1的數(shù)量 有1 11 ... 91, 十位上有10 11 12 13...19 = 10 + 10

f(203)=個位1的數(shù)量 11 21..91,101,111,121..191,201 = 21, 十位 10,11,12..19,110...119=20, 百位100,101,199=100

f(12013)=百位上1的數(shù)量 100-199,1100-1199,2100-2199,...9100-9199....11100-11199, 總共12*100=1200  即高位數(shù)high*當(dāng)前位數(shù)100

f(12113)=百位上1的數(shù)量 同上 高位數(shù)12*當(dāng)前位數(shù)100=1200, 再加上12100-12113 = 13+1 即低位數(shù)low+1, 總共為high*100+low+1

通過上述的例子,可以發(fā)現(xiàn)一個規(guī)律,就是對于百位上1出現(xiàn)的次數(shù),其受到三個因素影響:

1. 大于百位的,我們稱之為高位high,  比如對于12013, 其high為12, 其在百位上出現(xiàn)1的次數(shù)受到高位high影響: 100-199, 1100-1199....9100-9199,10100-10199,11100-11199, 因為high的影響,為12*100=high*100

2. 對于百位自身cur,如果百位上的數(shù)為0,則沒有1,如果等于1,則取決于低位low,比如113, 可以分解為 100-113, 即13+1=low+1. 如果大于1,比如813, 可分解為100-199, 即為100

所以現(xiàn)在需要解決的是然后獲得高位high(12013中的12), 當(dāng)前位cur(12013中的0), 以及低位low(12013中的13)

回到開頭那個重要的規(guī)律,根據(jù)這個規(guī)律,我們要用一個變量來代表當(dāng)前的位數(shù),個位為1,十位為10.。依次類推,用fac來表示,fac由1開始,每處理完一位將fac乘以10,代表移到下一位

 

以12013為例,

高位high的計算方法是 12013/1000 = 12013/(百位fac*10) = 12

當(dāng)前位cur的計算方法是 (12013/100)%10 = (12013/百位fac)%10 = 120%10 = 0

低位low的計算方法是 12013-(12013/100)*100 = 12013-(12013/百位fac)*百位fac = 12013 - 12000 = 13

 

則百位上1的總數(shù)有三種可能性:

1. 百位為0時 total = high*fac = 12*100 = 1200

2. 百位為1時 total = high*fac + low + 1 = 12*100 + 13 + 1

3. 百位為其他時 total = high* fac + fac = (high+1)*fac = (12+1)*100 

 

 

用傳統(tǒng)的方法和上述方法分別計算一個較長的數(shù),比如120131111, 結(jié)果如下:

TOTAL 1: 124234672
TIME USED: 1372
TOTAL 1: 124234672
TIME USED: 0

 

可見其性能差距之大

通過此題 我徹底找到了取余的感覺。。。。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 乌兰浩特市| 仁寿县| 古丈县| 屏南县| 永仁县| 雷州市| 米易县| 崇仁县| 榆社县| 博爱县| 右玉县| 上犹县| 铜梁县| 三穗县| 堆龙德庆县| 扶绥县| 灵川县| 武宣县| 嘉定区| 调兵山市| 青海省| 新民市| 明星| 神农架林区| 乐业县| 时尚| 依兰县| 景泰县| 嘉鱼县| 阿克| 通化县| 林周县| 昌宁县| 页游| 安国市| 巢湖市| 襄汾县| 宽城| 腾冲县| 泗阳县| 萨嘎县|