面试题答案
一键面试use std::sync::{Arc, atomic::{AtomicUsize, Ordering}};
use std::collections::HashMap;
fn count_numbers(arr: &[i32]) -> HashMap<i32, Arc<AtomicUsize>> {
let mut result = HashMap::new();
for &num in arr {
let count = result.entry(num).or_insert_with(|| Arc::new(AtomicUsize::new(0)));
count.fetch_add(1, Ordering::SeqCst);
}
result
}
时间复杂度分析
- 遍历数组:代码通过
for
循环遍历输入数组arr
一次,每次遍历执行的操作时间复杂度为常数级(O(1)
),因此遍历数组的时间复杂度为O(n)
,其中n
是数组的长度。 HashMap
操作:entry
方法用于获取或插入键值对,平均时间复杂度为O(1)
,fetch_add
操作的时间复杂度也是常数级O(1)
。由于这两个操作都在循环内部执行,总的时间复杂度仍然是O(n)
。
空间复杂度分析
HashMap
:HashMap
用于存储每个数字及其出现次数,最坏情况下,所有数字都不相同,HashMap
会存储n
个键值对,空间复杂度为O(n)
。- 原子操作:每个
AtomicUsize
占用固定大小的空间,总的空间复杂度也为O(n)
。
综上,时间复杂度为 O(n)
,空间复杂度为 O(n)
。