-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfrequency-tracker.rs
68 lines (57 loc) · 1.77 KB
/
frequency-tracker.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#![allow(dead_code, unused, unused_variables, non_snake_case)]
fn main() {}
struct Solution;
/**
* `&self` means the method takes an immutable reference.
* If you need a mutable reference, change it to `&mut self` instead.
*/
/**
* Your FrequencyTracker object will be instantiated and called as such:
* let obj = FrequencyTracker::new();
* obj.add(number);
* obj.delete_one(number);
* let ret_3: bool = obj.has_frequency(frequency);
*/
struct FrequencyTracker {
/// 每个数字对应的次数
s1: std::collections::HashMap<i32, i32>,
/// 每个次数对应的数字个数
s2: std::collections::HashMap<i32, i32>,
}
impl FrequencyTracker {
fn new() -> Self {
Self {
s1: Default::default(),
s2: Default::default(),
}
}
fn add(&mut self, number: i32) {
self.s1.entry(number).and_modify(|x| *x += 1).or_insert(1);
let n = self.s1[&number];
self.s2.entry(n).and_modify(|x| *x += 1).or_insert(1);
self.remove_s2_or_delete(n - 1);
}
fn remove_s2_or_delete(&mut self, times: i32) {
self.s2.entry(times).and_modify(|x| *x -= 1);
let &x = self.s2.get(×).unwrap_or(&0);
if x == 0 {
self.s2.remove(×);
}
}
fn delete_one(&mut self, number: i32) {
self.s1.entry(number).and_modify(|x| *x -= 1);
match self.s1.get(&number) {
Some(&x) => {
if x == 0 {
self.s1.remove(&number);
}
self.s2.entry(x).and_modify(|x| *x += 1).or_insert(1);
self.remove_s2_or_delete(x + 1);
}
_ => {}
}
}
fn has_frequency(&self, frequency: i32) -> bool {
self.s2.get(&frequency).is_some()
}
}