還是見codewars的Sum of Pairs:
一、相關的要求
Given a list of integers and a single sum value, return the first two values (parse from the left please) in order of appearance that add up to form the sum.sum_pairs([11, 3, 7, 5], 10)# ^--^ 3 + 7 = 10== [3, 7]sum_pairs([4, 3, 2, 3, 4], 6)# ^-----^ 4 + 2 = 6, indices: 0, 2 *# ^-----^ 3 + 3 = 6, indices: 1, 3# ^-----^ 2 + 4 = 6, indices: 2, 4# * entire pair is earlier, and therefore is the correct answer== [4, 2]sum_pairs([0, 0, -2, 3], 2)# there are no pairs of values that can be added to produce 2.== None/nil/undefined (Based on the language)sum_pairs([10, 5, 2, 3, 7, 5], 10)# ^-----------^ 5 + 5 = 10, indices: 1, 5# ^--^ 3 + 7 = 10, indices: 3, 4 *# * entire pair is earlier, and therefore is the correct answer== [3, 7]Negative numbers and duplicate numbers can and will appear.NOTE: There will also be lists tested of lengths upwards of 10,000,000 elements. Be sure your code doesn't time out.
二、我的解法
use std::collections::HashMap;fn sum_pairs(ints: &[i8], s: i8) -> Option<(i8, i8)> { // your code let mut pair: HashMap<i64, Option<(i8, i8)>> = HashMap::new(); let mut c = 0_i64; (&ints) .into_iter() .filter(|&x| { c += 1_i64; let mut indice = 0_64; (&ints[c as usize..]) .into_iter() .filter(|&y| { indice += 1_i64; match (*y) as i64 + (*x) as i64 == s as i64 { true => { pair.insert(indice + c, Some((*x, *y))); return true; } _ => return false, } }) .collect::<Vec<_>>() .len() > 0usize }) .collect::<Vec<_>>(); match pair.len() > 0 { true => { let mut indices: Vec<i64> = pair.keys().into_iter().map(|&x| x).collect(); indices.sort(); let min_indice = &indices.first().unwrap(); //println!("pair:{:?}", pair); //println!("indices:{:?} min_indice :{:?}", indices, min_indice); return *(pair.get(&min_indice).unwrap()); } _ => return None, }}
通過了測試,問題是提交逾時,有待最佳化。