news 2026/4/12 6:40:40

python编程实战(二)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
python编程实战(二)

题目一:

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。

关键数据结构:

列表 List[int],本质上是一维数组

关键思路:

任意一个连续子数组,都是以nums中的某个元素num[i]结尾,用dp[i]表示以nums[i]元素结尾的数组。如果dp[i-1]>0,会让nums[i]变大;反之如果是负数只会让nums[i]变小,不如从nums[i]重新开始。

dp[i]可以通过递归思想来表示,即dp[i]=dp[i-1]+nums[i](i>1);dp[0]=nums[0](i=0)

代码:

class Solution: def maxSubArray(self, nums: List[int]) -> int: # curr_sum 表示以当前元素结尾的最大子数组和 # max_sum 表示全局最大子数组和 curr_sum = max_sum = nums[0] for num in nums[1:]: # 如果 curr_sum 是负数,那么它对 num 没有贡献,应该从 num 重新开始 # 如果 curr_sum 是正数,那么加上 num 可能更好 # 下面的 max(num, curr_sum + num) 就是做这个选择 curr_sum = max(num, curr_sum + num) # 更新全局最大值 max_sum = max(max_sum, curr_sum) return max_sum

题目二:

给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。

关键数据结构:

列表

关键思路:

将一个数组向右轮转k个位置,可以如此理解:

先将整个数组翻转,然后在位置k处将数组分割成两部分,再把两部分的数组翻转回去。

如[1,2,3,4,5,6]向右轮转2个位置,可以先把数组翻转:[6,5,4,3,2,1]

然后分割为[6,5][4,3,2,1]分别翻转,得到[5,6,1,2,3,4],即所要求的结果

显然此种翻转是具有周期性的;当k>>n时,可以通过k%n获得等价翻转次数

代码中通过翻转函数来实现翻转操作,翻转函数本身使用了双指针定义。

代码:

class Solution: def rotate(self, nums: List[int], k: int) -> None: n = len(nums) k = k % n # 辅助反转函数 def reverse(start, end): while start < end: nums[start], nums[end] = nums[end], nums[start] start += 1 end -= 1 # 三次反转 reverse(0, n - 1) # 反转整个数组 reverse(0, k - 1) # 反转前k个 reverse(k, n - 1) # 反转剩余部分

题目三:

以数组intervals表示若干个区间的集合,其中单个区间为intervals[i] = [starti, endi]。请你合并所有重叠的区间,并返回一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间

关键数据结构:

List[List[int]],即列表的列表

关键方法:

intervals.sort(key=lambda x: x[0]) 按照x元素中的第一个位置的大小排序

关键思路:

如果要合并重叠区间,最好的方法是首先把区间按左端点大小排列起来,使得可以合并的区间都是相邻的;判断两个区间是否重叠,实际上就是判断一个区间的终点是否大于另一个区间的起点。区间通过列表来表示,区间的集合则通过列表的列表来表示。

代码:

class Solution: def merge(self, intervals: List[List[int]]) -> List[List[int]]: intervals.sort(key=lambda x: x[0]) # 按起点排序 merged = [] for interval in intervals: # 如果结果为空或不重叠,直接添加 if not merged or merged[-1][1] < interval[0]: #merged[-1]表示取merged中最后一个元素 merged.append(interval) else: # 重叠则合并,取最大右端点 merged[-1][1] = max(merged[-1][1], interval[1]) return merged
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/5 14:34:54

安捷伦53210A 53220A 53230A频率计数器

型号 53210A 53220A 53230A 类型 1 通道; 可选射频通道 2 通用通道; 可选射频通道 测量 频率、频率比、周期、输入电压最大值/最小值/峰峰值 时间间隔、上升/下降时间、信号周期、脉冲宽度、占空比、相位、累加 时间戳/MDA 分析 运算: 平滑 (读数移动平均数)、定标、Δ 变化、空…

作者头像 李华
网站建设 2026/4/11 3:32:17

2026毕设ssm+vue基于的在线考试系统设计论文+程序

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景 关于“毕业设计全过程管理”问题的研究&#xff0c;现有研究主要以“结果式”论文质量评价或单一环节信息化为主&#xff0c;…

作者头像 李华
网站建设 2026/4/9 13:28:20

5个关键步骤实现Label Studio Docker部署:告别环境配置困扰

5个关键步骤实现Label Studio Docker部署&#xff1a;告别环境配置困扰 【免费下载链接】label-studio 项目地址: https://gitcode.com/gh_mirrors/lab/label-studio 在人工智能项目的数据标注环节&#xff0c;团队协作和环境一致性是影响效率的关键因素。Label Studio…

作者头像 李华
网站建设 2026/4/7 3:48:13

嵌入式软件自学:单片机/C语言 五大区(专栏长期持续更新)

嵌入式软件核心&#xff1a;单片机/C语言五大内存区全解析&#xff08;原理、布局与实战&#xff09; 聚焦嵌入式内存管理落地与故障解决 一、核心认知&#xff1a;五大内存区的定位与核心价值 单片机运行C语言程序时&#xff0c;内存&#xff08;FlashRAM&#xff09;会被划分…

作者头像 李华
网站建设 2026/4/9 11:24:39

企业级云服务器部署应优先选择RHEL系还是Debian系操作系统?

企业级云服务器部署中&#xff0c;RHEL系&#xff08;如 RHEL、Rocky Linux、AlmaLinux&#xff09;通常更适合作为首选&#xff0c;但需结合具体场景权衡&#xff1b;Debian/Ubuntu LTS 在特定领域&#xff08;如云原生、开发友好性、成本敏感型场景&#xff09;同样具备强大竞…

作者头像 李华
网站建设 2026/4/3 6:46:09

如何快速掌握Java Excel处理:开发者的终极指南

如何快速掌握Java Excel处理&#xff1a;开发者的终极指南 【免费下载链接】fastexcel easyexcel作者最新升级版本&#xff0c; 快速、简洁、解决大文件内存溢出的java处理Excel工具 项目地址: https://gitcode.com/gh_mirrors/fast/fastexcel 在当今数据驱动的商业环境…

作者头像 李华