講的明白,但寫的明白嗎坞琴?

算法作業(yè)有一個(gè)小的題目:

一本書的頁(yè)碼從自然數(shù)1開始編碼直到自然數(shù)n哨查,按照通常的習(xí)慣,每個(gè)頁(yè)碼都不包含多余的前導(dǎo)數(shù)字0剧辐,例如第6頁(yè)用數(shù)字6而不是06或者006表示『ィ現(xiàn)在給定表示書的總頁(yè)碼的十進(jìn)制整數(shù)n(1 =< n <= 10^9),編程計(jì)算書的全部頁(yè)碼中分別用到多少次數(shù)字0, 1, 2, 3, 4, 5, 6, 7, 8, 9荧关。

比如一本數(shù)有123頁(yè)溉奕,那么各數(shù)字出現(xiàn)次數(shù)如下圖:

?快來數(shù)一數(shù)

解題思路不是很難想到,但是在寫作業(yè)報(bào)告忍啤,發(fā)現(xiàn)很難清楚地把這個(gè)算法過程給寫出來加勤。于是就認(rèn)真組織了語言,配上幾幅圖片同波,希望能把算法講明白鳄梅。(好多內(nèi)容自己會(huì)但不一定講的明白,講的明白也不一定寫的明白

思路

對(duì)于任意的一個(gè)頁(yè)碼數(shù)未檩,將其分為兩部分:個(gè)位數(shù)部分?jǐn)?shù)字和其他部分?jǐn)?shù)字戴尸。那么對(duì)于總頁(yè)碼為N的書本,其所有的頁(yè)碼可以放在如下的一個(gè)表格中冤狡,綠色表格代表頁(yè)碼孙蒙,里面的任意數(shù)字X[i][j] = i * 10 + j(方便我們理解项棠,這里假設(shè)N-3==0):

現(xiàn)在要做的就是統(tǒng)計(jì)所有綠色表格中數(shù)字0到9出現(xiàn)的次數(shù),綠色表格(也即任意一個(gè)頁(yè)碼)中數(shù)字組成其實(shí)可以拆分為對(duì)應(yīng)的行和列的數(shù)字組成马篮。例如對(duì)于頁(yè)碼123沾乘,其中1、2浑测、3各出現(xiàn)1次翅阵,它對(duì)應(yīng)的行的是123/10=12,列為123%10=3迁央,12和3中1掷匠、2、3也是各出現(xiàn)一次岖圈。

要計(jì)算所有的頁(yè)碼中0到9出現(xiàn)的總次數(shù)讹语,可以轉(zhuǎn)換為所有行中0到9出現(xiàn)的次數(shù)和所有列中0到9出現(xiàn)的次數(shù)。對(duì)于每一個(gè)綠色表格蜂科,其對(duì)應(yīng)的行和列中數(shù)字各出現(xiàn)一次顽决。因此我們可以先統(tǒng)計(jì)每一行和每一列綠色方格的數(shù)目,然后就可以得出每一行和每一列中0數(shù)字出現(xiàn)的次數(shù)导匣。如下圖:

  • 行的計(jì)數(shù):注意由于頁(yè)碼沒有01頁(yè)才菠、02頁(yè)這一說法,所以行[0]中0出現(xiàn)0次贡定,行[1]中1出現(xiàn)10次赋访,行[2]中2出現(xiàn)10次...行[11]中11出現(xiàn)10次...;
  • 列的計(jì)數(shù):列[0]中0出現(xiàn)N/10次缓待,列[1]中1出現(xiàn)N/10+1次...列[9]中9出現(xiàn)N/10次蚓耽。

看上去每行每列數(shù)字出現(xiàn)的次數(shù)有點(diǎn)凌亂,其實(shí)稍微劃分一下組成部分就可以了旋炒,如下分為五部分來計(jì)算(這里假設(shè)N-3==0步悠,方便我們講解):

  • 第一部分:第一行[0]中各列數(shù)字均出現(xiàn)1次;
  • 第二部分:最后一行[N/10]中列[0]瘫镇、列[1]贤徒、列[2]、列[3]中數(shù)字0汇四、1接奈、2、3各出現(xiàn)1次通孽;
  • 第三部分:列[0]到列[9]中0序宦、1、2...9每個(gè)數(shù)字都出現(xiàn)N/10 - 1次背苦。
  • 第四部分:行[1]到行[N/10-1]中每個(gè)數(shù)字出現(xiàn)的次數(shù)(也就是總頁(yè)碼為N/10 - 1時(shí)各個(gè)數(shù)字出現(xiàn)的次數(shù)--這里要遞歸哦)乘以10互捌。
  • 第五部分:行[N/10]中每個(gè)數(shù)字均出現(xiàn)4次潘明。

實(shí)現(xiàn)

Python實(shí)現(xiàn)如下:

def count_num(num):
    nums = [0 for x in range(10)]

    if num < 10:
        for i in range(1, num + 1):
            nums[i] = 1
        return nums
    
    # Part 1
    for i in range(1, 10):
        nums[i] += 1
        
    # Part 2
    units = num % 10
    for i in range(0, units + 1):
        nums[i] += 1
    
    # Part 3
    others = num / 10 - 1
    for i in range(0, 10):
        nums[i] += others
    
    # Part4
    count_others = count_num(others)
    for i in range(10):
        times_i = count_others[i] * 10
        nums[i] += times_i

    # Part 5
    digit_keep = []
    while num > 0:
        digit_keep.append(num % 10)
        num = num / 10
    times_units = digit_keep[0] + 1
    for digit in digit_keep[1:]:
        nums[digit] += times_units

    return nums

這篇文章沒有什么技術(shù)干貨,純粹逼自己試著去把一些算法寫的明白秕噪,大家覺得哪塊講的不明白钳降,我可以持續(xù)改進(jìn)哈。

更多文章腌巾,請(qǐng)移步我的博客

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末遂填,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子澈蝙,更是在濱河造成了極大的恐慌吓坚,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件灯荧,死亡現(xiàn)場(chǎng)離奇詭異礁击,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)逗载,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門哆窿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人厉斟,你說我怎么就攤上這事挚躯。” “怎么了捏膨?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)食侮。 經(jīng)常有香客問我号涯,道長(zhǎng),這世上最難降的妖魔是什么锯七? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任链快,我火速辦了婚禮,結(jié)果婚禮上眉尸,老公的妹妹穿的比我還像新娘域蜗。我一直安慰自己,他們只是感情好噪猾,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布霉祸。 她就那樣靜靜地躺著,像睡著了一般袱蜡。 火紅的嫁衣襯著肌膚如雪丝蹭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天坪蚁,我揣著相機(jī)與錄音奔穿,去河邊找鬼镜沽。 笑死,一個(gè)胖子當(dāng)著我的面吹牛贱田,可吹牛的內(nèi)容都是我干的缅茉。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼男摧,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蔬墩!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起彩倚,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤筹我,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后帆离,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔬蕊,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年哥谷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了岸夯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡们妥,死狀恐怖猜扮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情监婶,我是刑警寧澤旅赢,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站惑惶,受9級(jí)特大地震影響煮盼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜带污,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一僵控、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鱼冀,春花似錦报破、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至荸型,卻和暖如春蔽氨,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工鹉究, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宇立,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓自赔,卻偏偏與公主長(zhǎng)得像妈嘹,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子绍妨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 一润脸、實(shí)驗(yàn)?zāi)康?學(xué)習(xí)使用 weka 中的常用分類器,完成數(shù)據(jù)分類任務(wù)他去。 二毙驯、實(shí)驗(yàn)內(nèi)容 了解 weka 中 explo...
    yigoh閱讀 8,566評(píng)論 5 4
  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,005評(píng)論 6 13
  • To 顧同學(xué): 原諒我這樣稱呼你。不知道你現(xiàn)在過得怎么樣灾测?決定給你寫這封信爆价,是因?yàn)槲易蛱焱砩显僖淮螇?mèng)到你了。...
    KyreneXx閱讀 261評(píng)論 0 0
  • 好久不曾寫文媳搪,如今提字生澀铭段,倒也釋然。 丁酉年的開場(chǎng)平淡地像涼白開秦爆,跨年之夜聽聞閨密得到真愛序愚,躺在距離1262公里...
    SissiYu閱讀 197評(píng)論 0 0
  • 一季好夢(mèng)爸吮,一季年華,是一場(chǎng)完美的邂逅望门;時(shí)時(shí)追尋童年的懵懂形娇,可那已成為記憶的音符,只能定格在時(shí)間的軌跡中怒允;青春...
    鴛鴦素錦妃子傾城閱讀 310評(píng)論 0 0