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

Rust多层循环中Vector迭代器问题:切片迭代未按预期工作

问题分析与修复方案

你的代码核心问题是第二层循环的n2是切片nums[(n1+1)..]的局部索引,并非原数组nums的全局索引。第三层循环用nums[(n2+1)..]直接切片原数组,会从原数组的n2+1位置开始遍历,而非你期望的第二层当前元素的下一个位置。

修复方案一:基于上层切片嵌套切片

直接在每层切片的基础上继续切片,避免全局索引的混淆:

pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
    let mut res = Vec::new();

    for (n1, &i1) in nums.iter().enumerate() {
        let slice1 = &nums[(n1 + 1)..];
        for (n2, &i2) in slice1.iter().enumerate() {
            let slice2 = &slice1[(n2 + 1)..];
            for &i3 in slice2 {
                if i1 + i2 + i3 == 0 {
                    res.push(vec![i1, i2, i3]);
                }
            }
        }
    }
    res
}

修复方案二:计算全局索引

将第二层的局部索引转换为原数组的全局索引,再用于第三层切片:

pub fn three_sum(nums: Vec<i32>) -> Vec<Vec<i32>> {
    let mut res = Vec::new();

    for (n1, &i1) in nums.iter().enumerate() {
        for (n2, &i2) in nums[(n1 + 1)..].iter().enumerate() {
            // 转换为原数组的全局索引
            let global_n2 = n1 + 1 + n2;
            for &i3 in nums[(global_n2 + 1)..].iter() {
                if i1 + i2 + i3 == 0 {
                    res.push(vec![i1, i2, i3]);
                }
            }
        }
    }
    res
}

注:如果不需要使用索引值,完全可以去掉enumerate(),直接遍历切片元素,代码会更简洁。

内容的提问来源于stack exchange,提问作者dpr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 20:25:46