Skip to content

Commit 645a4ef

Browse files
authored
Merge pull request #481 from sir-gon/feature/frequency_queries
Feature/frequency queries
2 parents 359ba06 + 7218196 commit 645a4ef

File tree

2 files changed

+103
-16
lines changed

2 files changed

+103
-16
lines changed

src/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.js

Lines changed: 49 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,43 +2,78 @@
22
* @link Problem definition [[docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency-queries.md]]
33
*/
44

5-
// Complete the freqQuery function below.
5+
export function updateFrequency(frequencyMap, data, currentFreq, newFreq) {
6+
const freqMap = frequencyMap;
7+
8+
if (newFreq > 0) {
9+
if (freqMap?.[newFreq]) {
10+
freqMap[newFreq].push(data);
11+
} else {
12+
freqMap[newFreq] = [data];
13+
}
14+
}
15+
16+
if (freqMap?.[currentFreq]) {
17+
freqMap[currentFreq] = freqMap[currentFreq].filter((f) => f !== data);
18+
19+
if (freqMap[currentFreq].length === 0) {
20+
delete freqMap?.[currentFreq];
21+
}
22+
}
23+
24+
return freqMap;
25+
}
26+
627
export function freqQuery(queries) {
728
const result = [];
829
const dataMap = {};
30+
const freqMap = {};
931

1032
const __INITIAL__ = 0;
1133
const __INSERT__ = 1;
1234
const __DELETE__ = 2;
1335
const __SELECT__ = 3;
1436

37+
const __NOT_FOUND__ = 0;
38+
const __FOUND__ = 1;
39+
1540
queries.forEach((query) => {
1641
const [operation, data] = query;
1742

18-
const current = dataMap?.[data] ?? __INITIAL__;
43+
const currentFreq = dataMap?.[data] ?? __INITIAL__;
44+
let newFreq = currentFreq + 1;
1945

2046
switch (operation) {
2147
case __INSERT__:
22-
dataMap[data] = current + 1;
48+
// map of values
49+
dataMap[data] = currentFreq + 1;
50+
51+
// map of frequencies
52+
newFreq = currentFreq + 1;
2353
break;
2454
case __DELETE__:
25-
dataMap[data] = Math.max(0, current - 1);
55+
// map of values
56+
dataMap[data] = Math.max(0, currentFreq - 1);
57+
58+
// map of frequencies
59+
newFreq = currentFreq - 1;
60+
2661
break;
27-
case __SELECT__:
28-
for (const [key, value] of Object.entries(dataMap)) {
29-
console.log(key, value);
30-
if (value === data) {
31-
result.push(1);
32-
break;
33-
}
34-
}
35-
if (result.length === 0) {
36-
result.push(0);
62+
case __SELECT__: {
63+
if (freqMap?.[data]) {
64+
result.push(__FOUND__);
65+
} else {
66+
result.push(__NOT_FOUND__);
3767
}
3868
break;
69+
}
3970
default:
4071
throw new Error('Invalid operation');
4172
}
73+
74+
if (operation === __INSERT__ || operation === __DELETE__) {
75+
updateFrequency(freqMap, data, currentFreq, newFreq);
76+
}
4277
});
4378

4479
return result;

src/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency_queries.test.js

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,69 @@ const TEST_CASES = [
1717
[3, 2]
1818
],
1919
expected: [0, 1]
20+
},
21+
{
22+
title: 'Sample Test Case 1',
23+
input: [
24+
[3, 4],
25+
[2, 1003],
26+
[1, 16],
27+
[3, 1]
28+
],
29+
expected: [0, 1]
30+
},
31+
{
32+
title: 'Sample Test Case 2',
33+
input: [
34+
[1, 3],
35+
[2, 3],
36+
[3, 2],
37+
[1, 4],
38+
[1, 5],
39+
[1, 5],
40+
[1, 4],
41+
[3, 2],
42+
[2, 4],
43+
[3, 2]
44+
],
45+
expected: [0, 1, 1]
46+
},
47+
{
48+
title: 'Sample Test Case 3',
49+
input: [
50+
[1, 3],
51+
[1, 38],
52+
[2, 1],
53+
[1, 16],
54+
[2, 1],
55+
[2, 2],
56+
[1, 64],
57+
[1, 84],
58+
[3, 1],
59+
[1, 100],
60+
[1, 10],
61+
[2, 2],
62+
[2, 1],
63+
[1, 67],
64+
[2, 2],
65+
[3, 1],
66+
[1, 99],
67+
[1, 32],
68+
[1, 58],
69+
[3, 2]
70+
],
71+
expected: [1, 1, 0]
2072
}
2173
];
2274

2375
describe('frequency_queries', () => {
2476
it('freqQuery test cases', () => {
25-
expect.assertions(1);
77+
expect.assertions(4);
2678

2779
TEST_CASES.forEach((value) => {
2880
const answer = freqQuery(value.input);
2981

30-
console.debug(`checkMagazine(${value.input}) solution found: ${answer}`);
82+
console.debug(`freqQuery(${value.input}) solution found: ${answer}`);
3183

3284
expect(answer).toStrictEqual(value.expected);
3385
});

0 commit comments

Comments
 (0)