You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 12:43:14