假期結束了,準備好開始學習了嗎?今天給大家帶來一道列表的題目,快來看看你會不會解。前幾天有小伙伴問了一個Python列表的問題,這裡拿出來給大家分享下,一起學習下。 題目如下: Python學習交流Q群:903971231### SUMMER OF '69: Return the sum of th ...
假期結束了,準備好開始學習了嗎?今天給大家帶來一道列表的題目,快來看看你會不會解。前幾天有小伙伴問了一個Python列表的問題,這裡拿出來給大家分享下,一起學習下。
題目如下:
Python學習交流Q群:903971231### SUMMER OF '69: Return the sum of the numbers in the array, except ignore sections of numbers starting with a 6 and extending to the next 9 (every 6 will be followed by at least one 9). Return 0 for no numbers. summer_69([1, 3, 5]) --> 9 summer_69([4, 5, 6, 7, 8, 9]) --> 9 summer_69([2, 1, 6, 9, 11]) --> 14
嗯,英文提問,看上去有點懵!
02
解決過程
這個題目一看上去還是有點難度的,思路方面是個問題,值得大家探討了一發。
給出了幾個可行的思路。
1.解答
這裡給出瞭解答,如下所示:
def summer69(arr): index_of_6 = arr.index(6) index_of_9 = len(arr) - arr[::-1].index(9) - 1 sum_of_arr = 0 for i, j in enumerate(arr): if index_of_6 <= i <= index_of_9: pass else: sum_of_arr += arr[i] return sum_of_arr print(summer69([6, 6, 7, 8, 9, 8, 9, 2, 4]))
思路也很簡單,找到第一個6和最後一個9出現的位置,只要在6和9中間的就全部跳過,否則累加。乍一看,沒啥問題,但是套用題目中的三個測試用例,發現第一個測試用例不能通過,summer_69([1, 3, 5])會出錯。
整理上來看,還是符合要求的,已經非常不錯了,畢竟題目還是有點繞的。
2.解答
這裡給出的兩份代碼,第一個使用了flag標簽做狀態轉換,理解起來更加容易一些:
def summer_69(arr): total = 0 flag = 1 # 允許累計的標誌符 for i in arr: if i == 6: flag = 0 elif i == 9: flag = 1 continue total = total + i * flag return total
第二個方法代碼如下:
def summer_69(arr): total = 0 length = len(arr) left = 0 while left < length: if arr[left] == 6: for i in range(left, length): left = i if arr[i] == 9: break else: total += arr[left] left += 1 return total
這兩種方法,給的三個測試用例都通過了。
不得不承認這個*用的確實太贊了。
不過關於題意審核方面,關於9的理解有點歧義。
看看具體來理解了,起碼從測試情況來看,還是可以滿足要求的。
不過不慌,稍微優化下,
這樣的話,歧義方面也得到瞭解答,完美解決。
這裡給出了這道題目的參考答案,代碼如下:
def summer_69(arr): total = 0 add = True for num in arr: while add: if num != 6: total += num break else: add = False while not add: if num != 9: break else: add = True break return total
看上去邏輯還是有點難理解的,分的情況比較多。
這裡給出了一個遞歸的解法,代碼如下:
def summer_69(arr, res=0): if 6 in arr and 9 in arr: b = arr.index(6) e = arr.index(9) if b < e: del arr[b:e+1] else: res = res+9 del arr[e] return summer_69(arr, res) else: res += sum(arr) return res print(summer_69([1, 3, 5])) print(summer_69([4, 5, 6, 7, 8, 9])) print(summer_69([2, 1, 6, 9, 11]))
方法行之有效,運行結果如下:
不過他本人不推薦遞歸寫法,也比較推薦下麵的解法。
解法
這裡繼續補充了一個遞歸方法,代碼如下:
def s69(arr, total=0, status=1): if not arr: return total if arr[0] == 9 and status == 0: return s69(arr[1:], total, status=1) elif arr[0] == 6 or status == 0: return s69(arr[1:], total, status=0) else: return arr[0] + s69(arr[1:], total, status)
最後
這道題到這裡就結束了,你解出答案了嗎?沒解出來的告訴我,我看看有多少沒有解答出來,這一篇的內容到這裡就結束了,下一篇見。