点击上方“Python爬虫与数据挖掘”,进行关注
回复“书籍”即可获赠Python从入门到进阶共10本电子书
今
日
鸡
汤
海日生残夜,江春入旧年。
大家好,我是Python进阶者。
一、前言
前几天在Python最强王者交流群有个叫【Chloe】的粉丝问了一个Python列表的问题,这里拿出来给大家分享下,一起学习下。
![831aa1a4a9c5f34eaa17cd369ea7da02.png](https://i-blog.csdnimg.cn/blog_migrate/23171ef2d08222e2ade52b6c7f9c9dcd.png)
题目如下:
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
嗯,英文提问,看上去有点懵!
二、解决过程
这个题目一看上去还是有点难度的,思路方面是个问题,这里大佬们探讨了一发。
![536f36df09da1a9174cc579001cf954e.png](https://i-blog.csdnimg.cn/blog_migrate/5fd273414589c0d4f2a74505ca653188.png)
给出了几个可行的思路。
![c005a984e8022ff115411d0dd70a83df.png](https://i-blog.csdnimg.cn/blog_migrate/7d9951443d787e323d070e2cfa257738.png)
【小王】解答
这里【小王】给出了解答,如下图所示:
![a2dcb23215fd2ec207d1ad38ef7d9d35.png](https://i-blog.csdnimg.cn/blog_migrate/3e1e197ca8b03acce83820cd088991ac.png)
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])
会出错。
整理上来看,还是符合要求的,已经非常不错了,毕竟题目还是有点绕的。
![afc71e16bb31bebc2aab45cdd882d369.png](https://i-blog.csdnimg.cn/blog_migrate/6bf019e0714f257d960c13b6304c9e0b.png)
【月神】解答
这里给出【月神】的两份代码,第一个使用了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
这两种方法,给的三个测试用例都通过了。
![3927efeb93a3d241e6ea8b35951d304e.png](https://i-blog.csdnimg.cn/blog_migrate/e14119d1c9aca1bdf58e7fe556f42f4b.png)
不得不承认这个*
用的确实太赞了。
不过关于题意审核方面,关于9
的理解有点歧义。
![0dd803713db4fbeb0e14dc27778b932b.png](https://i-blog.csdnimg.cn/blog_migrate/ee93884b38033d62ea8268a588085410.png)
看看具体来理解了,起码从测试情况来看,还是可以满足要求的。
![d1204399d28ec1c5f385b448a47f4a4d.png](https://i-blog.csdnimg.cn/blog_migrate/7c5ac0a4cd484f40aba6a905e98dc454.png)
不过不慌,稍微优化下,
![1f30a0ec4b362dba9f58606aa62bf67e.png](https://i-blog.csdnimg.cn/blog_migrate/29ed8994496ebb16101e280559567351.png)
这样的话,歧义方面也得到了解答,完美解决。
![aca5e6211f7ffcf07f825ddd75b48532.png](https://i-blog.csdnimg.cn/blog_migrate/ce671333faa9d96c23c12b690cc16cd9.png)
【Chloe】解答
这里给出了这道题目的参考答案,代码如下:
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]))
方法行之有效,运行结果如下:
![b8cf28ca0f521f4fc08d8ecee1c09200.png](https://i-blog.csdnimg.cn/blog_migrate/ffe3f2f82bd5b7ad74007e86f946d948.png)
不过他本人不推荐递归写法,也比较推荐【月神】解法。
![795099cbc7c815dc0563f59097e05e71.png](https://i-blog.csdnimg.cn/blog_migrate/0b33c3c22ccd6a5b8b3483b71f0afa1b.png)
【月神】解法
这里【月神】继续补充了一个递归方法,代码如下:
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)
逻辑和瑜亮老师有点差别,各有所长。测试用例目前看结果都是对的。
三、总结
大家好,我是Python进阶者。这篇文章主要分享了一道Python基础题目的问题,针对该问题给出了具体的解析和代码演示,一共5个方法,顺利帮助粉丝顺利解决了问题,还额外做了一些知识拓展,如递归等,让大家学到很多东西。
![6c6fd5db1098c7e8a657f4053ca8b4a2.png](https://i-blog.csdnimg.cn/blog_migrate/95d7409b8e6602a18e20057579f0406a.png)
最后感谢粉丝【Chloe】提问,感谢【小王】、【月神】、【冷喵】、【瑜亮老师】、【Chloe】给出的思路、具体解析和代码演示,感谢【dcpeng】、【wangning】、【冷喵】、【冫马讠成】等人参与学习交流。
小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何Python问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。
------------------- End -------------------
往期精彩文章推荐:
欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持
想加入Python学习群请在后台回复【入群】
万水千山总是情,点个【在看】行不行