- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
2025年程序员逻辑思维题(附答案)终章
第一题:循环边界与条件的逻辑陷阱
某团队在开发实时数据统计模块时,需要计算数组中连续子数组的最大和,其中子数组长度至少为3(包含3)。程序员小张编写了如下伪代码:
```python
defmax_subarray_sum(arr):
n=len(arr)
ifn3:
returnNone数组长度不足3时返回空
max_sum=-float(inf)
current_sum=arr[0]+arr[1]+arr[2]
max_sum=current_sum
foriinrange(3,n):
current_sum+=arr[i]-arr[i-3]滑动窗口,每次加新元素减最旧元素
ifcurrent_summax_sum:
max_sum=current_sum
returnmax_sum
```
测试用例1:输入[1,-2,3,4,-5,6],预期输出应为3+4+(-5)+6=8(子数组长度4),但实际输出为7(子数组[3,4,-5]和为2?需重新计算)。测试用例2:输入[5,-1,2,0,-3,4],预期输出为5+(-1)+2+0=6(长度4),实际输出为6(正确)。测试用例3:输入[-2,-3,-1,-4],预期输出为-2+(-3)+(-1)=-6(唯一长度3的子数组),实际输出为-6(正确)。
问题:小张的代码在哪些情况下会出错?请指出具体逻辑错误,并给出修正后的代码及解析。
答案及解析
小张的代码存在两处关键逻辑错误:
1.初始窗口的覆盖范围不全:代码中初始的current_sum被设定为前3个元素的和(arr[0]+arr[1]+arr[2]),但当数组长度恰好为3时,这是正确的;但当数组长度大于3时,可能存在更长的子数组(长度3)的和更大,而初始max_sum仅记录了长度为3的子数组的和,未考虑后续滑动窗口中可能出现的更长的子数组。例如测试用例1中,正确的最大和来自长度为4的子数组(3,4,-5,6),和为8,但初始max_sum被设为前3个元素的和(1-2+3=2),后续滑动窗口计算时,当i=3(第4个元素),current_sum=2+4-arr[0]=2+4-1=5;i=4时,current_sum=5+(-5)-arr[1]=5-5+2=2;i=5时,current_sum=2+6-arr[2]=2+6-3=5。显然,这与预期结果8不符,说明滑动窗口的逻辑未正确覆盖所有可能的子数组长度。
2.滑动窗口的逻辑错误:代码中的滑动窗口每次仅保留最新的3个元素(通过current_sum+=arr[i]-arr[i-3]),这实际上将子数组长度固定为3,而非允许长度≥3。例如,当子数组长度为4时,正确的计算应是在长度为3的基础上累加下一个元素,而小张的代码通过减法强制窗口长度不变,导致无法计算更长的子数组。
修正思路:
题目要求子数组长度至少为3,因此需要允许子数组长度为3、4、…、n(n≥3)。正确的做法是使用动态规划思想,维护两个状态:以当前元素结尾的、长度≥3的子数组的最大和。具体来说,定义dp[i]为以第i个元素结尾的、长度≥3的子数组的最大和。对于每个i(i≥2),有两种选择:
-扩展前一个子数组(长度≥3),即dp[i]=dp[i-1]+arr[i](此时子数组长度+1);
-以当前元素为结尾,重新开始一个长度为3的子数组,即sum(arr[i-2],arr[i-1],arr[i])。
取两者的最大值作为dp[i],最终所有dp[i]中的最大值即为答案。
修正代码:
```python
defmax_subarray_sum(arr):
n=len(arr)
ifn3:
returnNone
初始化前3个元素的和
current_max=sum(arr[0:3])
max_sum=current_max
从第3个元素(索引3)开始遍历,i表示子数组的结尾索引
foriinrange(3,n):
情况1:扩展前一个子数组(长度≥3),和为前一个max+当前元素
情况2:新的长度为3的子数组,和为arr[i-2]+arr[i-1]+arr[i]
current_max=max(curr
原创力文档


文档评论(0)