前言
很显然,Python的受众远远大于C++,其实笔者本人对Python的理解也是远强于C++的,C++纯粹是为了假装笔者是个职业选手才随便玩玩的,借着十多年前学的C的功底,强行假装的。
因职业原因,Python更适用于运维、网络、AI方向,所以用得很多。最近假装职业码农装过头了,写点Python代码都习惯性加 ; 了,更离谱的是CSDN对笔者的能力判断中,C++一个劲地涨,Python都连能力都没了…
所以以后也要用Python来解解题,经常锻炼一下。
提示:以下是本篇文章正文内容,下面案例可供参考
一、题目
题目描述:
给一个无序数组,求最长递增的区间长度。如:[5,2,3,8,1,9] 最长区间 2,3,8 长度为 3。(测试用例仅做参考,我们会根据代码质量进行评分)
输入描述:
第一行输入整数n。 第二行输入n个整数。
输出描述:
输出最长递增的区间长度。
示例:
输入
6
5 2 3 8 1 9
输出
3
这题昨天才做过,也是python解的。虽然才放完假,没心情做事,但咱也不能干重复的事,不重复造轮子是吧,所以咱玩点花活,用一行代码解决它
二、一行超人
代码如下(示例):
result=max(list(reduce(lambda x, y: x + y, [[i for i in range(len(list(num)))] for item, num in groupby(list(map(lambda x: x+0,[arr[i-1]<arr[i] for i in range(1,len(arr))])))])))+2
为这一行解决,想了我大半天,到处找文章学习,看到了一篇介绍groupby的文章才有想法,又看到一篇说对 [1 ,1, 1, 0, 0, 1, 1, 0] 这种数组分组的文章。reduce以前是内置的不用引入,现在改到functools库里了,groupby是itertools标准库里的,都是内置的不用安装什么。
三、分析一下思路
[arr[i-1]<arr[i] for i in range(1,len(arr))]
这行代码是一个列表生成式,根据测试数据:
arr = [5, 2, 3, 8, 1, 9]
会生成如下列表:
[False, True, True, False, True]
lambda x: x+0
这是一个匿名函数,用于把False转成0,True转成1,map是把前面的列表传入这个函数。再用list给转成列表,因为map运行后的结果是一个对象。
用 groupby分组,用reduce统计,它需要三个参数,另一个匿名lambda x, y作为reduce的参数,这里省了第三个参数初始值,默认None,实际上可以把最后的加2作为参数写入的,但括号实在太多,老眼昏花的,数不清了。虽然reduce的结果就是list,但好像不能直接max,所以又加了一个list转换,最后的max是求出这个分组列表中的最大值,然后加2,因为计算过程中不计第一个。
下面是在命令提示中的测试:
原题示例:
改一下arr:arr+=[11,12,13,14]
再把最大连续增长放到最前面试一下:
证明可行!不过很遗憾的是:CSDN的python解释器不认这个一行超人代码,不报错也不给结果。
于是,我又想了一个一行解决的办法,比上面的方法更简单有效!
我以为CSDN这解释器不让引用库,就想了一个不用引入库的办法如下:
result=len(max( ''.join(list(map(lambda x: str(x+0),[arr[i-1]<arr[i] for i in range(1,len(arr))]))).split('0') ))+1
这个代码要简洁一点哈~ 咱生成0和1字符串,再把它以0切割了,这样就成了:
[‘11’, ‘1’] 如此这样的数据,我再max一下,len一下并加1,搞定!
完整代码如下:
def solution(self, n, arr):
# 不正经方法1,CSDN网页版不可行
result = max(list(reduce(lambda x, y: x + y, [[i for i in range(len(list(num)))] for item, num in groupby(list(map(lambda x: x+0,[arr[i-1]<arr[i] for i in range(1,len(arr))])))])))+2
# 不正经方法2,CSDN网页版可行,100分
result=len(max( ''.join(list(map(lambda x: str(x+0),[arr[i-1]<arr[i] for i in range(1,len(arr))]))).split('0') ))+1
# TODO: 请在此编写代码,以下是正经代码,可过100分
result,tmp = 1, 1
for i in range(n):
if i+1 < n and arr[i+1] > arr[i]:
tmp += 1
else:
result = tmp if tmp > result else result
tmp = 1
总结
玩这花活,其实对理解lambda,列表生成式,map很有用的。并且编程这个事嘛,想法最重要!为什么要学算法?算法也是解决问题的想法。工作中会遇到很多奇奇怪怪的事,特别对我们运维、系统集成工作。那是八仙过海,啥办法都能上。这是一个很好的学习的过程。而且不是很好玩吗?
希望本文对各位看官理解python有点小用!