鱼C论坛

 找回密码
 立即注册
查看: 5871|回复: 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

test模块请找33,34题中。
test.assert_equals(maxSequence([]), 0)
test.assert_equals(maxSequence([-2, 1, -3, 4, -1, 2, 1, -5, 4]), 6)
test.assert_equals(maxSequence([-1, -1]), 0)
test.assert_equals(maxSequence(
    [-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]), 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次循环就能得结果,而不需要循环中间套循环了。
思路就是先求局部最大值,再求全局最大值,而全局最大值必然是出自局部最大值中的。
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]

def longchop(lst):
    local_max = global_max = -999999999
    for i in lst:
        local_max = max(i, local_max + i )
        global_max = max(global_max, local_max)
    return global_max

print (longchop(longlist))

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

使用道具 举报

发表于 2017-4-28 21:25:34 | 显示全部楼层
本帖最后由 余欲渔 于 2017-4-28 21:33 编辑
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)])
a=[-2, 1, -3, 4, -1, 2, 1, -5, 4]
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 | 显示全部楼层
我觉得以前不是这样想问题的,现在第一想法就是暴力破解
# 暴力破解,最后加上 [0] 是应对空列表或者全是负数的列表
def maxS(n):
    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 | 显示全部楼层
list1 = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
x = sorted(list1)
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 | 显示全部楼层
def maxSequence(lst):
    if len(lst) == 0:
        print('空列表,返回0')
        return 0
    else:
        sequece = []
        maxSum = -float('inf')
        for i in range(len(lst)):
            for j in range(i+1, len(lst)+1):
                if sum(lst[i:j]) >= maxSum:
                    maxSum = sum(lst[i:j])
                    if maxSum > 0:
                        sequece.append(lst[i:j])
        if maxSum < 0:
            print('最大切片和为负,返回0')
            return 0
        else:
            max_Seq = []
            for i in sequece:
                if sum(i) == maxSum:
                    max_Seq.append(i)
            return maxSum,max_Seq   # 返回最大和及对应切片

list1 = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
list2 = [-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]
list3 = []
list4 = [-1,-1,-1,-1]
list5 = [2,3,4,-1,-100,-1,4,3,2,0, -199, ]

print(maxSequence(list1))
print(maxSequence(list2))
print(maxSequence(list3))
print(maxSequence(list4))
print(maxSequence(list5))


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

使用道具 举报

发表于 2017-12-1 20:48:46 | 显示全部楼层
def maxSequence(lst):
    if len(lst) == 0:
        print('空列表,返回0')
        return 0
    else:
        sequece = []
        maxSum = -float('inf')
        for i in range(len(lst)):
            for j in range(i+1, len(lst)+1):
                if sum(lst[i:j]) >= maxSum:
                    maxSum = sum(lst[i:j])
                    if maxSum > 0:
                        sequece.append(lst[i:j])
        if maxSum < 0:
            print('最大切片和为负,返回0')
            return 0
        else:
            max_Seq = []
            for i in sequece:
                if sum(i) == maxSum:
                    max_Seq.append(i)
            return maxSum,max_Seq   # 返回最大和及对应切片

list1 = [-2, 1, -3, 4, -1, 2, 1, -5, 4]
list2 = [-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]
list3 = []
list4 = [-1,-1,-1,-1]
list5 = [2,3,4,-1,-100,-1,4,3,2,0, -199, ]

print(maxSequence(list1))
print(maxSequence(list2))
print(maxSequence(list3))
print(maxSequence(list4))
print(maxSequence(list5))

###
(6, [[4, -1, 2, 1]])
(84, [[17, 15, 23, 29]])
空列表,返回0
0
最大切片和为负,返回0
0
(9, [[2, 3, 4], [4, 3, 2], [4, 3, 2, 0]])

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

def maxS(n):
    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-12-1 22:41:39 | 显示全部楼层
看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

def maxSequence(x):
    y = []
    if len(x) == 0:
        return 0
    else:
        for i in range(len(x)):
            y.append(x[i])
            result = x[i]
            for j in range(i+1,len(x)):
                result += x[j]
                y.append(result)
        return max(y)
    
## 测试
test.assert_equals(maxSequence([]), 0)
test.assert_equals(maxSequence([-2, 1, -3, 4, -1, 2, 1, -5, 4]), 6)
test.assert_equals(maxSequence([-1, -1]), 0)
test.assert_equals(maxSequence(
    [-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]), 84)


## 结果
Success!
Success!
Fail!-1 not equals 0

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
def maxSequence(intarr):
    if intarr==[]:
        return 0
    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, 2025-1-16 08:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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