如何在twoSum函数满足条件时立即返回结果并解决编译错误?
问题:两数之和函数中找到目标值后立即返回结果
原始代码:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i = 0; vector<int> arr = {}; for(;i<nums.size();i++){ int j = i + 1; for(;j<nums.size();j++){ if((nums[i] + nums[j]) == target){ arr.push_back(i); arr.push_back(j); } } } return arr; } };
需求:希望在if条件成立时立即返回arr,不再执行后续循环。试过break但只能退出内层j的循环,外层i的循环仍会继续,该如何实现?
补充说明:之前尝试在if语句中用return,但出现编译错误,错误信息如下:
编译错误
第20行第5个字符:错误:非void函数未在所有控制路径中返回值 [-Werror,-Wreturn-type]
}
^
生成1个错误。
解决方法
方法一:直接在找到结果时return,保留末尾的return语句
编译错误的核心原因是编译器检测到存在函数无返回值的控制路径——如果你只在if里加了return,却删除了函数末尾的return arr;,当没有找到符合条件的数对时(尽管题目保证有解,但编译器无法识别这一点),函数就没有返回值,触发报错。
修改后的代码:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i = 0; vector<int> arr = {}; for(;i<nums.size();i++){ int j = i + 1; for(;j<nums.size();j++){ if((nums[i] + nums[j]) == target){ arr.push_back(i); arr.push_back(j); return arr; // 找到结果后立即返回 } } } return arr; // 保证所有路径都有返回值,消除编译错误 } };
这种方法最直接,找到符合条件的数对后立刻返回结果,无需继续循环。
方法二:使用标志位终止外层循环
如果不想提前return,可以设置一个布尔标志位,找到结果后标记为true,跳出内层循环,再在外层循环的条件中判断标志位,终止外层循环:
class Solution { public: vector<int> twoSum(vector<int>& nums, int target) { int i = 0; vector<int> arr = {}; bool found = false; // 用于标记是否找到结果 for(;i<nums.size() && !found;i++){ int j = i + 1; for(;j<nums.size();j++){ if((nums[i] + nums[j]) == target){ arr.push_back(i); arr.push_back(j); found = true; break; // 跳出内层循环 } } } return arr; } };
内容的提问来源于stack exchange,提问作者Seven
相关产品推荐
相关产品推荐

