最大子数组和代码逻辑无误却输出异常,求问题排查
问题根源:无符号整数类型转换导致循环未执行
你的代码输出-2147483648(即INT_MIN)的核心原因是有符号整数与无符号整数的隐式转换,导致循环体一次都没运行,maxsum始终保持初始值。
具体分析:
nums.size()返回的是size_t类型(无符号整数),而你的循环变量i是int类型(有符号)。在比较i++ < nums.size()时,C++会将i隐式转换为size_t类型。- 初始时
i=-1,转换为size_t后会变成该类型的最大值(比如32位系统下是4294967295),这个值远大于nums.size()(此处为9),因此循环条件直接不成立,循环体从未执行。 - 此时
maxsum一直是初始的INT_MIN,函数自然返回这个错误值。
修复方案
以下几种方式都可以解决问题,推荐使用更简洁直观的写法:
方案1:使用范围for循环(最简洁)
直接遍历数组元素,完全避免索引类型问题:
#include<bits/stdc++.h> using namespace std; int maxSubArray(vector<int> nums) { int sum = 0; int maxsum = INT_MIN; for (int num : nums) { sum += num; maxsum = max(sum, maxsum); if (sum < 0) sum = 0; } return maxsum; } int main() { vector<int> arr{-2,1,-3,4,-1,2,1,-5,4}; cout << maxSubArray(arr); return 0; }
方案2:将循环变量改为size_t类型
匹配nums.size()的类型,避免转换问题:
#include<bits/stdc++.h> using namespace std; int maxSubArray(vector<int> nums) { int sum = 0; int maxsum = INT_MIN; size_t i = 0; while (i < nums.size()) { sum += nums[i]; maxsum = max(sum, maxsum); if (sum < 0) sum = 0; i++; } return maxsum; } int main() { vector<int> arr{-2,1,-3,4,-1,2,1,-5,4}; cout << maxSubArray(arr); return 0; }
方案3:将nums.size()转为int类型
如果坚持保留原循环结构,先把数组长度转为int类型再使用:
#include<bits/stdc++.h> using namespace std; int maxSubArray(vector<int> nums) { int sum = 0; int maxsum = INT_MIN; int i = -1; int n = nums.size(); // 转换为int类型 while (i++ < n) { if (i < n) sum += nums[i]; maxsum = max(sum, maxsum); if (sum < 0) sum = 0; } return maxsum; } int main() { vector<int> arr{-2,1,-3,4,-1,2,1,-5,4}; cout << maxSubArray(arr); return 0; }
修复后运行测试用例,输出会是预期的6。
内容的提问来源于stack exchange,提问作者Mihir Sanjay
相关产品推荐
相关产品推荐

