說在前面
“提取數(shù)字串并求和”是一個經(jīng)典的算法問題:從鍵盤讀取一串文本,提取其中的連續(xù)數(shù)字串,轉(zhuǎn)換為正整數(shù)后累加起來,輸出結(jié)果。
例1,輸入:abc101defg92h,輸出:193。因?yàn)?01+92=193。
例2,輸入:abc101defg925,輸出:1026。因?yàn)?01+925=1026。
要求編寫一段Python程序,實(shí)現(xiàn)上述功能。

教學(xué)思路
“提取數(shù)字串并求和”涉及遍歷字符串、判斷數(shù)字字符、提取字符串和數(shù)字串轉(zhuǎn)整數(shù)等問題,頭緒較多,直接分析代碼的話,容易陷入細(xì)節(jié)的泥淖,很難突出重點(diǎn)。最好是分解知識點(diǎn),先從簡單的問題開始,由淺入深,逐層遞進(jìn),突出算法本質(zhì),磨礪學(xué)生思維。
鋪墊一:累積單個數(shù)字和。
(1)編寫Python程序?qū)崿F(xiàn)如下功能:從鍵盤讀取一串文本,將其中的單個數(shù)字累加起來,并輸出結(jié)果。例如,輸入:abc101defg925,輸出:18。因?yàn)?+0+1+9+2+5=18。print("數(shù)字和: " + str(s))答案:填空1:"0" <= ch <= "9";填空2:int(ch)。解析:通過此題讓學(xué)生掌握遍歷字符串和判斷數(shù)字字符的方法,并注意先使用int()函數(shù)將數(shù)字字符轉(zhuǎn)換成整數(shù)再求和。鋪墊二:提取數(shù)字串并求和。
(2)已知字符串text = "abc101defg925",則int(text[3:6]) + int(text[10:])的值為多少?解析:通過此題讓學(xué)生掌握使用切片提取連續(xù)數(shù)字串的方法,明白數(shù)字串切片中起點(diǎn)和終點(diǎn)坐標(biāo)(左右邊界)的含義,由此引出對于任意字符串,如何定位并提取其中連續(xù)數(shù)字串的方法。重點(diǎn)一:對于任意字符串,如何提取其中連續(xù)數(shù)字串并求和?(3)自定義函數(shù)d_sum(text)能夠提取文本text中的連續(xù)數(shù)字串,并返回累加后的結(jié)果。例1,若text = "abc101defg92h",則返回193;例2,若text = "abc101defg925",則返回1026。請編程實(shí)現(xiàn)函數(shù)d_sum()的功能。下列代碼意圖實(shí)現(xiàn)函數(shù)d_sum()的功能,請將缺失的代碼補(bǔ)充完整: if "0" <= text[i] <= "9":答案:填空1:j < len(text) and "0" <= text[j] <= "9";填空2:s + int(text[i:j]);填空3:j + 1或j;填空4:i + 1。解析:提取連續(xù)數(shù)字串的關(guān)鍵在于找到數(shù)字串的左右邊界。程序使用變量i來定位數(shù)字串的左邊界,一旦找到首數(shù)字,即讓i停止掃描,同時定義變量j來定位數(shù)字串的右邊界,讓j從i+1處開始掃描該連續(xù)數(shù)字串,直到text[j]為非數(shù)字為止,則text[i:j]就是要提取的數(shù)字串。填空3和4,分別對應(yīng)text[i]為數(shù)字和非數(shù)字兩種情形下,變量i向右移動的方法。此題第1空容易錯填為"0"
<= text[j] <= "9",這是沒有考慮下標(biāo)是否越界;另一個容易錯填的答案為"0"
<= text[j] <= "9" and j < len(text),這是不理解邏輯運(yùn)算符的運(yùn)算規(guī)則。
(4)閱讀如下Python程序段,猜測程序輸出結(jié)果:解析:函數(shù)f(s)的作用是把數(shù)字串s轉(zhuǎn)換成十進(jìn)制整數(shù)num,其采用了著名的累乘相加算法。使用累乘相加算法的前提條件是字符串s為純數(shù)字串,那么對于任意字符串,能否使用累乘相加算法計算其中連續(xù)數(shù)字串的值并求和呢?重點(diǎn)二:使用累乘相加算法,計算任意文本中連續(xù)數(shù)字串的值并求和。(5)自定義函數(shù)d_sum2(text)能夠提取文本text中的連續(xù)數(shù)字串,并返回累加后的結(jié)果。例1,若text = "abc101defg92h",則返回193;例2,若text = "abc101defg925",則返回1026。下列代碼意圖使用累乘相加算法實(shí)現(xiàn)函數(shù)d_sum2()的功能,請將缺失的代碼補(bǔ)充完整:答案:填空1:num * 10 + int(ch);填空2:0;填空3:s += num。解析:程序使用累乘相加算法計算數(shù)字串的值。變量num用來存儲當(dāng)前數(shù)字串的值,一旦遇到非數(shù)字字符,即將num的值累加到s中,并將num歸零,以便處理下一個數(shù)字串。當(dāng)尾字符也是數(shù)字時,for循環(huán)體內(nèi)沒有機(jī)會把num累加到s中,故需要在循環(huán)體外執(zhí)行語句s += num;若尾字符不是數(shù)字,則num=0,循環(huán)體外執(zhí)行語句s += num,也不會改變s的值。故無論尾字符是否為數(shù)字,都應(yīng)該在循環(huán)體外執(zhí)行語句s += num。
課后作業(yè)
自定義函數(shù)d_sum(text)定義了兩個變量i和j分別表示數(shù)字串的左右邊界,并使用了二重循環(huán)來遍歷字符串,以提取并累加所有的數(shù)字串,那么,該程序的時間復(fù)雜度是多少呢?O(n^2)還是O(n)?
自定義函數(shù)d_sum2(text)只有一重for循環(huán),它的功能和函數(shù)d_sum(text)是一樣的,那么,能否也使用一重for循環(huán)來改寫函數(shù)d_sum(text)呢? 下列代碼意圖實(shí)現(xiàn)函數(shù)d_sum()的功能,請將缺失的代碼補(bǔ)充完整: for j in range(len(text)): if not "0" <= text[j] <= "9": if i < j: #左右邊界不相等,說明text[i:j]是數(shù)字串
需要本文word文檔、源代碼和課后思考答案的,可以加入“Python算法之旅”知識星球參與討論和下載文件,“Python算法之旅”知識星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。
我們專注Python算法,感興趣就一起來!
相關(guān)優(yōu)秀文章:
閱讀代碼和寫更好的代碼
最有效的學(xué)習(xí)方式
Python算法之旅文章分類