Python每日一练:最长递增的区间长度(一行代码花样解法)

news/2024/11/27 2:10:53/

文章目录

  • 前言
  • 一、题目
  • 二、一行超人
    • 三、分析一下思路
  • 总结


前言

很显然,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 = 11for i in range(n):if i+1 < n and arr[i+1] > arr[i]:tmp += 1else:result = tmp if tmp > result else resulttmp = 1

总结

玩这花活,其实对理解lambda,列表生成式,map很有用的。并且编程这个事嘛,想法最重要!为什么要学算法?算法也是解决问题的想法。工作中会遇到很多奇奇怪怪的事,特别对我们运维、系统集成工作。那是八仙过海,啥办法都能上。这是一个很好的学习的过程。而且不是很好玩吗?
希望本文对各位看官理解python有点小用!


http://www.ppmy.cn/news/61879.html

相关文章

树脂塞孔有哪些优缺点及应用?

树脂塞孔的概述 树脂塞孔就是利用导电或者非导电树脂&#xff0c;通过印刷&#xff0c;利用一切可能的方式&#xff0c;在机械通孔、机械盲埋孔等各种类型的孔内进行填充&#xff0c;实现塞孔的目的。 树脂塞孔的目的 1 树脂填充各种盲埋孔之后&#xff0c;利于层压的真空下…

Android 13 变更及适配攻略

准备工作 首先将我们项目中的 targetSdkVersion和compileSdkVersion 升至 33。 影响Android 13上所有应用 1.通知受限 对新安装的应用的影响&#xff1a; 如果用户在搭载 Android 13 或更高版本的设备上安装您的应用&#xff0c;应用的通知默认处于关闭状态。在您请求新的…

多通道振弦传感器无线采集仪通过短信和FTP文件修改参数

多通道振弦传感器无线采集仪通过短信和FTP文件修改参数 通过短信修改参数 向设备发送参数修改指令&#xff0c;设备在下次采发过程中若收到包含有合法指令的短信时会解析并执行短信内的指令&#xff0c;参数修改完成后会以短信形式回发应答信息。短信指令的格式如下&#xff1a…

各种ID生成策略对比

1. id⾃增的劣势 问题&#xff1a;当数据量庞⼤时&#xff0c;在数据库分库分表后&#xff0c;数据库⾃增id不能满⾜唯⼀id来标识数据&#xff1b;因为每个表都按⾃⼰节奏⾃增&#xff0c;会造成id冲突&#xff0c;⽆法满⾜需求。 所以分布式id就有了一定规则 - 全局唯一&…

三角函数最小正周期

由于 2 π 是正弦函数 y sin ⁡ x , x ∈ R 的周期&#xff0c; 由于2\pi是正弦函数y\sin x,x\in R的周期&#xff0c; 由于2π是正弦函数ysinx,x∈R的周期&#xff0c; 下面只需证明任一小于 2 π 的正数都不是那个函数的周期。 下面只需证明任一小于2\pi的正数都不是那个函数…

USB2.0(一):基础

一、总线标准 USB1.1&#xff1a;支持12Mbps全速率&#xff08;FullSpeed&#xff09;和1.5Mbps低速率&#xff08; HalfSpeed&#xff09;USB2.0&#xff1a;支持480Mbps高速率&#xff08;High Speed&#xff09;&#xff0c;兼容1.1USB3.0&#xff1a;支持5Gbps超高速率&am…

ScriptableObject上的prefab内容暂用,ScriptableObject详解

ScriptableObject是Unity引擎中的一种特殊类型&#xff0c;它允许你创建可扩展的、自定义的数据容器&#xff0c;用于在项目中存储和管理数据。它们非常适合存储那些不直接关联场景对象的数据&#xff0c;例如配置数据、游戏设置、AI行为树、技能和物品属性等。 ScriptableObj…

全方位揭秘!大数据从0到1的完美落地之运行流程和分片机制

一个完整的MapReduce程序在分布式运行时有三类实例进程&#xff1a; MRAppMaster: 负责整个程序的过程调度及状态协调MapTask: 负责Map阶段的整个数据处理流程ReduceTask: 负责Reduce阶段的整个数据处理流程 当一个作业提交后(mr程序启动)&#xff0c;大概流程如下&#xff1…