Next Permutation代码错误排查:多测试用例不符合预期问题求助
下一个字典序排列代码错误排查
原代码问题分析
问题1:测试用例[3,2,1]输出错误
原代码中第一个for循环重新声明了局部变量i:
for(int i = n-2 ; i >= 0 ; i--){ if(nums[i] < nums[i+1]) break; }
这里的i和函数开头声明的int n = nums.size() , i , l;中的i是两个独立变量。当测试用例为[3,2,1]时,循环内的i会递减到-1,但外层的i仍为未初始化的垃圾值,不会触发if(i<0)的反转逻辑,反而进入else块执行错误的交换和反转,导致输出[3,1,2]而非预期的[1,2,3]。
问题2:去掉else块中for循环的int后多测试用例失败
当修改为for(l = n-1 ; l > i ; l--)时,虽然l使用了外层声明的变量,但第一个for循环的i仍是局部变量,外层i依旧是未初始化的垃圾值。此时else块的逻辑基于错误的i值执行:
- 对于
[1,2,3],垃圾i可能是一个非法值,导致l直接定位到数组末尾,交换第一个和最后一个元素后反转,得到[3,1,2]; - 对于
[1,1,5],同样因错误的i值,错误交换了第一个和最后一个元素,输出[5,1,1]。
修正后的代码
class Solution { public: void nextPermutation(vector<int>& nums) { int n = nums.size(); int i = n - 2; // 从后往前找第一个nums[i] < nums[i+1]的位置 while (i >= 0 && nums[i] >= nums[i+1]) { i--; } if (i >= 0) { // 从后往前找第一个比nums[i]大的元素 int l = n - 1; while (nums[l] <= nums[i]) { l--; } swap(nums[i], nums[l]); } // 反转i之后的元素,转为升序 reverse(nums.begin() + i + 1, nums.end()); } };
核心修正点
- 统一变量作用域:避免在循环内重新声明外层已定义的变量(如
i),确保循环结束后变量值能被后续逻辑正确使用; - 明确循环逻辑:使用
while循环更清晰地表达“找到第一个符合条件的位置”的逻辑,避免for循环因提前break导致的变量值歧义; - 确保边界处理:当未找到任何
nums[i] < nums[i+1]的位置(即数组已为降序),直接反转整个数组,符合下一个排列的定义。
内容的提问来源于stack exchange,提问作者Aviral Mishra
相关产品推荐
相关产品推荐

