Skip to content

Commit 315cbcd

Browse files
author
Gonzalo Diaz
committed
[Hacker Rank] Interview Preparation Kit: Dictionaries and Hashmaps: Frequency Queries. Try to reduce complexity using OOP.
1 parent 7a26637 commit 315cbcd

File tree

1 file changed

+70
-54
lines changed
  • algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps

1 file changed

+70
-54
lines changed

algorithm-exercises-java/src/main/java/ae/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/FrequencyQueries.java

Lines changed: 70 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -24,83 +24,99 @@ private FrequencyQueries() {
2424
private static final int __NOT_FOUND__ = 0;
2525
private static final int __FOUND__ = 1;
2626

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+
2790
/**
2891
* FrequencyQueries.
2992
*/
3093
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<>();
3497

3598
for (List<Integer> query : queries) {
3699
int operation = query.get(0);
37100
long value = query.get(1);
38101

39-
Long currentFreqCount = valueFreqs.getOrDefault(value, null);
40-
Long newFreqCount;
41-
List<Long> newFreq;
42-
43102
switch (operation) {
44103
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);
66105

67106
break;
68107
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);
93109

94110
break;
95111
case __SELECT__:
96-
result.add(freqMap.containsKey(value) ? __FOUND__ : __NOT_FOUND__);
112+
fq.result.add(fq.freqMap.containsKey(value) ? __FOUND__ : __NOT_FOUND__);
97113
break;
98114
default:
99115
throw new IllegalArgumentException(
100116
"Operation %d not supported".formatted(operation));
101117
}
102118
}
103119

104-
return result;
120+
return fq.result;
105121
}
106122
}

0 commit comments

Comments
 (0)