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
相关产品推荐
相关产品推荐

