假期结束了,准备好开始学习了吗?今天给大家带来一道列表的题目,快来看看你会不会解。前几天有小伙伴问了一个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)
最后
这道题到这里就结束了,你解出答案了吗?没解出来的告诉我,我看看有多少没有解答出来,这一篇的内容到这里就结束了,下一篇见。