녹과 LeetCode 문제를 해결하기 위해 노력하는 동안에서의 HashMap
use std::collections::HashMap;
fn two_sum(nums: &Vec<i32>, target: i32) -> (usize, usize) {
let mut map = HashMap::new();
for (i, x) in nums.iter().enumerate() {
match map.get(target - x) {
Some(k) => return (k, i),
None => map.insert(x, i)
};
}
return (0, 0);
}
fn main() {
let ret = two_sum(&vec![1,2,3], 4);
println!("{}, {}", ret.0, ret.1);
}
컴파일러는 불평 : 나는 원시 타입과 HashMap
를 만들 수 없습니다 것 같습니다 :
error[E0308]: mismatched types
--> two_sum.rs:6:23
|
6 | match map.get(target - x) {
| ^^^^^^^^^^ expected reference, found i32
|
= note: expected type `&_`
= note: found type `i32`
error[E0308]: mismatched types
--> two_sum.rs:7:32
|
7 | Some(k) => return (k, i),
| ^expected usize, found reference
|
= note: expected type `usize`
= note: found type `&_`
Rust에서 HashMap과 함께 항상 참조를 사용해야합니까?
편집 :
이 필요처럼 ...이 솔루션은 어쨌든 조금 추한하지만 작품을 보이는 보인다.
use std::collections::HashMap;
fn two_sum(nums: &[i32], target: i32) -> (usize, usize) {
let mut map = HashMap::new();
for (i, x) in nums.iter().enumerate() {
let df = target - x;
if map.contains_key(&df) {
return (*map.get(&df).unwrap(), i);
}
map.insert(x, i);
}
return (0, 0);
}
fn main() {
let ret = two_sum(&vec![1,2,3], 4);
println!("{}, {}", ret.0, ret.1);
}
기본 유형과 함께 HashMaps를 사용하는 것이 더 나은 솔루션인지 아니면 모범 사례인지 궁금합니다.
- 이 해시 동안, 그것은 그래서
Option<&V>
반환 K: Borrow<Q>, Q: Hash + Eq
&Q
를 받아 : 당신이 get
방법의 서명을 선택하면
[std :: collections :: HashMap :: get] (https://doc.rust-lang.org/stable/std/collections/struct.HashMap.html#method.get)의 서명은 예라고 표시합니다. , 참조를 사용하십시오. – ljedrz
주 :'two_sum'이'& [i32]'인수를 취하는 것은 더 관용적입니다 (가능한 인수의 엄격한 상위 집합을 허용하므로). –