<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          “提取數(shù)字串算法”教學(xué)思路

          共 3896字,需瀏覽 8分鐘

           ·

          2023-02-25 12:27

          說在前面

          “提取數(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。
          參考代碼如下,請將缺失的代碼補(bǔ)充完整:
          text = input('輸入一串文本:')
          s = 0
          for ch in text:
              if 填空1:
                  s += 填空2
          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:])的值為多少?

          答案:1026。
          解析:通過此題讓學(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ǔ)充完整:
          def d_sum(text):
              s = 0
              i = 0
              while i < len(text):
                  if "0" <= text[i] <= "9":
                      j = i + 1
                      while 填空1:
                          j += 1
                      s = 填空2
                      i = 填空3
                  else:
                      i = 填空4
              return s

          答案:填空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é)果:
          def f(s):
              num = 0
              for ch in s: 
                  num = num * 10 + int(ch)
              return num
          print(f("101")+f("92"))

          答案:193。
          解析:函數(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ǔ)充完整:
          def d_sum2(text):
              num = s = 0
              for ch in text: 
                  if "0" <= ch <= "9": 
                      num = 填空1
                  else:
                      s += num
                      num = 填空2
              填空3
              return s

          答案:填空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ǔ)充完整:
          def d_sum(text):
              s = 0
              i = 0  #數(shù)字字符左邊界
              for j in range(len(text)): 
                  if not "0" <= text[j] <= "9": 
                      if i < j:  #左右邊界不相等,說明text[i:j]是數(shù)字串
                          s = 填空1
                      i = 填空2  #更新左邊界
              if 填空3:
                  s += int(text[i:])
              return s


          需要本文word文檔、源代碼和課后思考答案的,可以加入“Python算法之旅”知識星球參與討論和下載文件,Python算法之旅”知識星球匯集了數(shù)量眾多的同好,更多有趣的話題在這里討論,更多有用的資料在這里分享。

          我們專注Python算法,感興趣就一起來!

          相關(guān)優(yōu)秀文章:

          閱讀代碼和寫更好的代碼

          最有效的學(xué)習(xí)方式

          Python算法之旅文章分類

          瀏覽 86
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  日韩精品久久久久久久酒店 | 日韩 精品 无码 系列 视频 | 经典三级在线视频 | 国产永久视频 | 婷婷国产成人精品一区二区 |