Rust如何检查Vec<isize>中是否存在两个元素相加等于指定目标值
你的实现思路整体可行,但需要调整所有权处理和遍历逻辑,具体修改如下:
原有代码的核心问题
- 你使用了
into_iter()直接消费了contents向量的所有权,后续在any闭包中无法再访问contents的内容,会直接触发所有权编译错误 - 没有控制内层遍历的范围,直接遍历全量元素会出现单个元素重复使用的问题(比如目标值为200、数组中存在100的场景下,会误判为存在符合条件的两个元素)
暴力解法实现(适合小数据量)
fn check_for_factors(contents: &[isize], target: isize) -> bool { contents .iter() .enumerate() .any(|(i, &x)| { // 仅遍历当前元素之后的切片,避免重复匹配和单元素复用 contents[i + 1..].iter().any(|&y| x + y == target) }) }
调用方式如下:
let input = "12 122 100 4444 34 3 66 78 9"; let contents: Vec<isize> = input.lines() .map(|l| l.trim().parse().unwrap()) .collect(); // 输出false,你提供的测试用例中不存在两个元素相加等于300的情况 println!("{}", check_for_factors(&contents, 300));
哈希集合优化实现(适合大数据量,时间复杂度O(n))
如果数组元素较多,暴力解法的O(n²)时间复杂度性能不足,可以用哈希集合存储已遍历过的元素,将时间复杂度降到O(n):
use std::collections::HashSet; fn check_for_factors_fast(contents: &[isize], target: isize) -> bool { let mut seen = HashSet::new(); for &num in contents { let complement = target - num; if seen.contains(&complement) { return true; } seen.insert(num); } false }
内容的提问来源于stack exchange,提问作者t56k
相关产品推荐
相关产品推荐

