最近在看资料时看到了一个如标题所示的面试题,面试题是Java版,正好最近在学Python,就先用Python实现了。毕竟life is short,use python(玩笑话,算法设计思路是共同的,每种语言的实现方式都大同小异)。
分析: m个连续的整数加和是最大,那么最简单的实现方式就是:从下标为0查找m个元素,依次n个数组成的容器进行遍历,每次遍历判断当前最大的m个数之和,遍历结束后返回。
#原始数据
a = (133,445,6768,23,656,12305,768,234,787,6321,5677,234,1445,3551,547,3245,12357)
def maxseq(seq,m):
# 断言:确保形参类型准确,其中序列形式可以是列表、元组、集合形式
assert isinstance(seq,(list,tuple,set)) and isinstance(m,int),"seq must list,tuple,set and m must int"
assert len(seq) > m, "len(seq) must >m"
# 将序列转化为列表
seq = list(seq)
# 解包的方式定义两个列表(java中的数组)容器
#tempseq 存放临时数据,mxseq存放最大数据
tempseq ,mxseq = [],[]
# 取出当前的列表的长度,避免每次循环执行此方法一次,优化程序
lens = len(seq)
#从下标为0开始遍历
for i in range(0,lens):
#避免下标越界
if (i+m) <= lens:
#对连续的m个数进行切片,存放到临时列表
tempseq = seq[i:i+m]
#判断的逻辑是: 当(mxseq为空)或者(mxseq不为空并且mxseq加和小于tempseq加和)
if (not mxseq) or (mxseq and (sum(mxseq) < sum(tempseq))):
#mxseq改变
mxseq = tempseq[:]
# for循环正常结束返回mxseq
else:
return mxseq
print(maxseq(a,5))
注释已经写的很清楚,就不在进行详细的解释了。初学python并且对算法知识也是一知半解,如果你有好的建议,可不要吝啬哦!