鱼C论坛

 找回密码
 立即注册
查看: 5064|回复: 36

[技术交流] Python : 每日一题 35

[复制链接]
发表于 2017-4-27 13:53:46 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
相信前两天看那么多字的题目已经烦了,今天看个简单的。

求出数列中和最大的切片的值。
例如[-2, 1, -3, 4, -1, 2, 1, -5, 4]中,[ 4, -1, 2, 1]的和最大为6,则返回 6
如果空列表,或者和为负,则返回0


  1. test模块请找33,34题中。
  2. test.assert_equals(maxSequence([]), 0)
  3. test.assert_equals(maxSequence([-2, 1, -3, 4, -1, 2, 1, -5, 4]), 6)
  4. test.assert_equals(maxSequence([-1, -1]), 0)
  5. test.assert_equals(maxSequence(
  6.     [-6, 21, -4, 19, -27, 22, -19, -27, 2, 20, -16, 26, 5, 13, -14, 22, -17, 23, -7, -8, 3, 26, -11, -28, 15, -21, -6,
  7.      -22, 24, -2, -29, 28, 22, -6, 17, 4, -29, 3, 8, 2, -18, -1, -9, -23, 9, -18, 17, 15, 23, 29]), 84)
复制代码


我的代码如下:
游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-4-27 13:58:44 | 显示全部楼层
发完感觉好像和昨天的题目有点类型重复了,算了,就这样了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-27 16:25:00 From FishC Mobile | 显示全部楼层
思路
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-27 21:20:39 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-4-27 21:21 编辑

这题可以用动态规划算法,这样只要1次循环就能得结果,而不需要循环中间套循环了。
思路就是先求局部最大值,再求全局最大值,而全局最大值必然是出自局部最大值中的。
  1. longlist = [-6, 21, -4, 19, -27, 22, -19, -27, 2, 20, -16, 26, 5, 13, -14, 22, -17, 23, -7, -8, 3, 26, -11, -28, 15, -21, -6,
  2.      -22, 24, -2, -29, 28, 22, -6, 17, 4, -29, 3, 8, 2, -18, -1, -9, -23, 9, -18, 17, 15, 23, 29]

  3. def longchop(lst):
  4.     local_max = global_max = -999999999
  5.     for i in lst:
  6.         local_max = max(i, local_max + i )
  7.         global_max = max(global_max, local_max)
  8.     return global_max

  9. print (longchop(longlist))
复制代码


输出:
84
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2017-4-28 21:25:34 | 显示全部楼层
本帖最后由 余欲渔 于 2017-4-28 21:33 编辑
  1. qp=lambda x:0 if a==[] or max(a)<=0 else max([sum(a[i:j]) for i in range(len(a)) for j in range(i+1,len(a)+1)])
  2. a=[-2, 1, -3, 4, -1, 2, 1, -5, 4]
  3. print(qp(a))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2017-4-28 21:39:02 | 显示全部楼层
jerryxjr1220 发表于 2017-4-27 21:20
这题可以用动态规划算法,这样只要1次循环就能得结果,而不需要循环中间套循环了。
思路就是先求局部最大 ...


这样确实一轮就结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-5-13 21:20:05 | 显示全部楼层
厉害了,jerry
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-22 21:09:09 | 显示全部楼层
我觉得以前不是这样想问题的,现在第一想法就是暴力破解
  1. # 暴力破解,最后加上 [0] 是应对空列表或者全是负数的列表
  2. def maxS(n):
  3.     return max([sum(n[i:j]) for i in range(len(n)) for j in range(i+1,len(n)+1)]+[0])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-21 16:46:45 | 显示全部楼层
  1. list1 = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
  2. x = sorted(list1)
  3. print(x.pop())
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-21 16:47:42 | 显示全部楼层

显然你这个答案不能满足要求啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-27 19:40:11 | 显示全部楼层
算法挠头......
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-1 20:43:27 | 显示全部楼层
  1. def maxSequence(lst):
  2.     if len(lst) == 0:
  3.         print('空列表,返回0')
  4.         return 0
  5.     else:
  6.         sequece = []
  7.         maxSum = -float('inf')
  8.         for i in range(len(lst)):
  9.             for j in range(i+1, len(lst)+1):
  10.                 if sum(lst[i:j]) >= maxSum:
  11.                     maxSum = sum(lst[i:j])
  12.                     if maxSum > 0:
  13.                         sequece.append(lst[i:j])
  14.         if maxSum < 0:
  15.             print('最大切片和为负,返回0')
  16.             return 0
  17.         else:
  18.             max_Seq = []
  19.             for i in sequece:
  20.                 if sum(i) == maxSum:
  21.                     max_Seq.append(i)
  22.             return maxSum,max_Seq   # 返回最大和及对应切片

  23. list1 = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
  24. list2 = [-6, 21, -4, 19, -27, 22, -19, -27, 2, 20, -16, 26, 5, 13, -14, 22, \
  25.          -17, 23, -7, -8, 3, 26, -11, -28, 15, -21, -6, -22, 24, -2, -29, 28, \
  26.          22, -6, 17, 4, -29, 3, 8, 2, -18, -1, -9, -23, 9, -18, 17, 15, 23, 29]
  27. list3 = []
  28. list4 = [-1,-1,-1,-1]
  29. list5 = [2,3,4,-1,-100,-1,4,3,2,0, -199, ]

  30. print(maxSequence(list1))
  31. print(maxSequence(list2))
  32. print(maxSequence(list3))
  33. print(maxSequence(list4))
  34. print(maxSequence(list5))


  35. #暴力破解
  36. (6, [[4, -1, 2, 1]])
  37. (84, [[17, 15, 23, 29]])
  38. 空列表,返回0
  39. 0
  40. 最大切片和为负,返回0
  41. 0
  42. (9, [[2, 3, 4], [4, 3, 2], [4, 3, 2, 0]])
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-1 20:48:46 | 显示全部楼层
  1. def maxSequence(lst):
  2.     if len(lst) == 0:
  3.         print('空列表,返回0')
  4.         return 0
  5.     else:
  6.         sequece = []
  7.         maxSum = -float('inf')
  8.         for i in range(len(lst)):
  9.             for j in range(i+1, len(lst)+1):
  10.                 if sum(lst[i:j]) >= maxSum:
  11.                     maxSum = sum(lst[i:j])
  12.                     if maxSum > 0:
  13.                         sequece.append(lst[i:j])
  14.         if maxSum < 0:
  15.             print('最大切片和为负,返回0')
  16.             return 0
  17.         else:
  18.             max_Seq = []
  19.             for i in sequece:
  20.                 if sum(i) == maxSum:
  21.                     max_Seq.append(i)
  22.             return maxSum,max_Seq   # 返回最大和及对应切片

  23. list1 = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
  24. list2 = [-6, 21, -4, 19, -27, 22, -19, -27, 2, 20, -16, 26, 5, 13, -14, 22, \
  25.          -17, 23, -7, -8, 3, 26, -11, -28, 15, -21, -6, -22, 24, -2, -29, 28, \
  26.          22, -6, 17, 4, -29, 3, 8, 2, -18, -1, -9, -23, 9, -18, 17, 15, 23, 29]
  27. list3 = []
  28. list4 = [-1,-1,-1,-1]
  29. list5 = [2,3,4,-1,-100,-1,4,3,2,0, -199, ]

  30. print(maxSequence(list1))
  31. print(maxSequence(list2))
  32. print(maxSequence(list3))
  33. print(maxSequence(list4))
  34. print(maxSequence(list5))

  35. ###
  36. (6, [[4, -1, 2, 1]])
  37. (84, [[17, 15, 23, 29]])
  38. 空列表,返回0
  39. 0
  40. 最大切片和为负,返回0
  41. 0
  42. (9, [[2, 3, 4], [4, 3, 2], [4, 3, 2, 0]])

  43. #  笨方法,本质上和楼上的solomonxian 的思路是一样的,不过solomonxian的+[0]很巧妙,一句代码也很简洁。

  44. def maxS(n):
  45.     return max([sum(n[i:j]) for i in range(len(n)) for j in range(i+1,len(n)+1)]+[0])

  46. # 学习了
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-12-1 22:41:39 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-12 15:08:26 | 显示全部楼层
  1. def fun(n):
  2.     c=[0]
  3.     for i in range(len(n)):
  4.         for ii in range(i,len(n)+1):
  5.             c = (sum(n[i:ii])>sum(c)) and n[i:ii] or c
  6.     return c,sum(c)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-27 15:33:09 | 显示全部楼层
还行
  1. ## 代码
  2. import test

  3. def maxSequence(x):
  4.     y = []
  5.     if len(x) == 0:
  6.         return 0
  7.     else:
  8.         for i in range(len(x)):
  9.             y.append(x[i])
  10.             result = x[i]
  11.             for j in range(i+1,len(x)):
  12.                 result += x[j]
  13.                 y.append(result)
  14.         return max(y)
  15.    
  16. ## 测试
  17. test.assert_equals(maxSequence([]), 0)
  18. test.assert_equals(maxSequence([-2, 1, -3, 4, -1, 2, 1, -5, 4]), 6)
  19. test.assert_equals(maxSequence([-1, -1]), 0)
  20. test.assert_equals(maxSequence(
  21.     [-6, 21, -4, 19, -27, 22, -19, -27, 2, 20, -16, 26, 5, 13, -14, 22, -17, 23, -7, -8, 3, 26, -11, -28, 15, -21, -6,
  22.      -22, 24, -2, -29, 28, 22, -6, 17, 4, -29, 3, 8, 2, -18, -1, -9, -23, 9, -18, 17, 15, 23, 29]), 84)


  23. ## 结果
  24. Success!
  25. Success!
  26. Fail!-1 not equals 0

  27. Success!
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-5-28 21:18:12 | 显示全部楼层
ok
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-18 14:43:40 | 显示全部楼层
本帖最后由 小强工作室 于 2018-7-18 16:50 编辑

import itertools
def itertools_demo(x):
    list1=[]
    for i in range(len(x)):
        for j in itertools.accumulate(x[i:len(x)+1]):#运用模块迭代累加
            list1.append(j)
    print(max(list1))
if __name__=="__main__":
    longlist =[-6, 21, -4, 19, -27, 22, -19, -27, 2, 20, -16, 26, 5, 13, -14, 22, -17, 23, -7, -8, 3, 26, -11, -28, 15, -21, -6,-22, 24, -2, -29, 28, 22, -6, 17, 4, -29, 3, 8, 2, -18, -1, -9, -23, 9, -18, 17, 15, 23, 29]
    itertools_demo(longlist)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-27 16:41:14 | 显示全部楼层
xuexixuexi
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-29 11:37:17 | 显示全部楼层
I Love Fishc
  1. def maxSequence(intarr):
  2.     if intarr==[]:
  3.         return 0
  4.     return (max([sum (each)for each in [intarr[i:k] for i in range(len(intarr)) for k in range(i,len(intarr)+3)]]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 04:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表