@@ -24,83 +24,99 @@ private FrequencyQueries() {
24
24
private static final int __NOT_FOUND__ = 0 ;
25
25
private static final int __FOUND__ = 1 ;
26
26
27
+ Map <Long , Long > valueFreqs = new HashMap <>();
28
+ Map <Long , List <Long >> freqMap = new HashMap <>();
29
+ List <Integer > result = new ArrayList <>();
30
+
31
+ void insert (Long value ) {
32
+ Long currentFreqCount = this .valueFreqs .getOrDefault (value , null );
33
+ Long newFreqCount ;
34
+ List <Long > newFreq ;
35
+
36
+ newFreqCount = (currentFreqCount == null ? __INITIAL__ : currentFreqCount + 1L );
37
+ valueFreqs .put (value , newFreqCount );
38
+
39
+ newFreq = freqMap .getOrDefault (newFreqCount , null );
40
+
41
+ // delete current frequency
42
+ if (currentFreqCount != null ) {
43
+ freqMap .get (currentFreqCount ).remove (value );
44
+ if (freqMap .get (currentFreqCount ).isEmpty ()) {
45
+ freqMap .remove (currentFreqCount );
46
+ }
47
+ }
48
+
49
+ // add new frequency
50
+ if (newFreq == null ) {
51
+ newFreq = new ArrayList <>();
52
+ newFreq .add (value );
53
+ freqMap .put (newFreqCount , newFreq );
54
+ } else {
55
+ freqMap .get (newFreqCount ).add (value );
56
+ }
57
+ }
58
+
59
+ void delete (Long value ) {
60
+ Long currentFreqCount = this .valueFreqs .getOrDefault (value , null );
61
+ Long newFreqCount ;
62
+ List <Long > newFreq ;
63
+
64
+ newFreqCount = (currentFreqCount == null ? 0 : currentFreqCount - 1L );
65
+ if (newFreqCount > 0L ) {
66
+ valueFreqs .put (value , newFreqCount );
67
+
68
+ newFreq = freqMap .getOrDefault (newFreqCount , null );
69
+ // add new frequency
70
+ if (newFreq == null ) {
71
+ newFreq = new ArrayList <>();
72
+ newFreq .add (value );
73
+ freqMap .put (newFreqCount , newFreq );
74
+ } else {
75
+ freqMap .get (newFreqCount ).add (value );
76
+ }
77
+ } else {
78
+ valueFreqs .remove (value );
79
+ }
80
+
81
+ // delete current frequency
82
+ if (currentFreqCount != null ) {
83
+ freqMap .get (currentFreqCount ).remove (value );
84
+ if (freqMap .get (currentFreqCount ).isEmpty ()) {
85
+ freqMap .remove (currentFreqCount );
86
+ }
87
+ }
88
+ }
89
+
27
90
/**
28
91
* FrequencyQueries.
29
92
*/
30
93
static List <Integer > freqQuery (List <List <Integer >> queries ) {
31
- List < Integer > result = new ArrayList <>();
32
- Map < Long , Long > valueFreqs = new HashMap <> ();
33
- Map < Long , List < Long >> freqMap = new HashMap <>();
94
+
95
+ FrequencyQueries fq = new FrequencyQueries ();
96
+ fq . result = new ArrayList <>();
34
97
35
98
for (List <Integer > query : queries ) {
36
99
int operation = query .get (0 );
37
100
long value = query .get (1 );
38
101
39
- Long currentFreqCount = valueFreqs .getOrDefault (value , null );
40
- Long newFreqCount ;
41
- List <Long > newFreq ;
42
-
43
102
switch (operation ) {
44
103
case __INSERT__ :
45
- newFreqCount = (currentFreqCount == null ? __INITIAL__ : currentFreqCount + 1L );
46
- valueFreqs .put (value , newFreqCount );
47
-
48
- newFreq = freqMap .getOrDefault (newFreqCount , null );
49
-
50
- // delete current frequency
51
- if (currentFreqCount != null ) {
52
- freqMap .get (currentFreqCount ).remove (value );
53
- if (freqMap .get (currentFreqCount ).isEmpty ()) {
54
- freqMap .remove (currentFreqCount );
55
- }
56
- }
57
-
58
- // add new frequency
59
- if (newFreq == null ) {
60
- newFreq = new ArrayList <>();
61
- newFreq .add (value );
62
- freqMap .put (newFreqCount , newFreq );
63
- } else {
64
- freqMap .get (newFreqCount ).add (value );
65
- }
104
+ fq .insert (value );
66
105
67
106
break ;
68
107
case __DELETE__ :
69
- newFreqCount = (currentFreqCount == null ? 0 : currentFreqCount - 1L );
70
- if (newFreqCount > 0L ) {
71
- valueFreqs .put (value , newFreqCount );
72
-
73
- newFreq = freqMap .getOrDefault (newFreqCount , null );
74
- // add new frequency
75
- if (newFreq == null ) {
76
- newFreq = new ArrayList <>();
77
- newFreq .add (value );
78
- freqMap .put (newFreqCount , newFreq );
79
- } else {
80
- freqMap .get (newFreqCount ).add (value );
81
- }
82
- } else {
83
- valueFreqs .remove (value );
84
- }
85
-
86
- // delete current frequency
87
- if (currentFreqCount != null ) {
88
- freqMap .get (currentFreqCount ).remove (value );
89
- if (freqMap .get (currentFreqCount ).isEmpty ()) {
90
- freqMap .remove (currentFreqCount );
91
- }
92
- }
108
+ fq .delete (value );
93
109
94
110
break ;
95
111
case __SELECT__ :
96
- result .add (freqMap .containsKey (value ) ? __FOUND__ : __NOT_FOUND__ );
112
+ fq . result .add (fq . freqMap .containsKey (value ) ? __FOUND__ : __NOT_FOUND__ );
97
113
break ;
98
114
default :
99
115
throw new IllegalArgumentException (
100
116
"Operation %d not supported" .formatted (operation ));
101
117
}
102
118
}
103
119
104
- return result ;
120
+ return fq . result ;
105
121
}
106
122
}
0 commit comments