Skip to content

Commit 0ee6985

Browse files
author
Gonzalo Diaz
committed
[REFACTOR] [Hacker Rank] Interview Preparation Kit: Dictionaries and Hashmaps: Frequency Queries. Solved ✅. Solve all test cases.
1 parent 2caa0f6 commit 0ee6985

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import { describe, expect, it } from '@jest/globals';
2+
import { logger as console } from '../../../logger';
3+
4+
import { freqQuery } from './frequency_queries_optimized';
5+
import TEST_CASES from './frequency_queries_testcases.json';
6+
7+
describe('frequency_queries', () => {
8+
it('freqQuery test cases', () => {
9+
expect.assertions(4);
10+
11+
TEST_CASES.forEach((value) => {
12+
const answer = freqQuery(value.input);
13+
14+
console.debug(`freqQuery(${value.input}) solution found: ${answer}`);
15+
16+
expect(answer).toStrictEqual(value.expected);
17+
});
18+
});
19+
20+
it('freqQuery border case', () => {
21+
expect.assertions(1);
22+
23+
expect(() => {
24+
freqQuery([[4, 1]]);
25+
}).toThrow('Invalid operation');
26+
});
27+
});
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
/**
2+
* @link Problem definition [[docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency-queries.md]]
3+
*/
4+
5+
export function updateFrequency(
6+
frequencyMap: Record<number, number[]>,
7+
data: number,
8+
currentFreq: number,
9+
newFreq: number
10+
): Record<number, number[]> {
11+
const freqMap = frequencyMap;
12+
13+
if (newFreq > 0) {
14+
if (freqMap?.[newFreq]) {
15+
freqMap[newFreq].push(data);
16+
} else {
17+
freqMap[newFreq] = [data];
18+
}
19+
}
20+
21+
if (freqMap?.[currentFreq]) {
22+
freqMap[currentFreq] = freqMap[currentFreq].filter(
23+
(f: number) => f !== data
24+
);
25+
26+
if (freqMap[currentFreq].length === 0) {
27+
delete freqMap?.[currentFreq];
28+
}
29+
}
30+
31+
return freqMap;
32+
}
33+
34+
export function freqQuery(queries: number[][]): number[] {
35+
const result: number[] = [];
36+
const dataMap: Record<number, number> = {};
37+
const freqMap: Record<number, number[]> = {};
38+
39+
const __INITIAL__ = 0;
40+
const __INSERT__ = 1;
41+
const __DELETE__ = 2;
42+
const __SELECT__ = 3;
43+
44+
const __NOT_FOUND__ = 0;
45+
const __FOUND__ = 1;
46+
47+
queries.forEach((query) => {
48+
const [operation, data] = query;
49+
50+
const currentFreq = dataMap?.[data] ?? __INITIAL__;
51+
let newFreq = currentFreq + 1;
52+
53+
switch (operation) {
54+
case __INSERT__:
55+
// map of values
56+
dataMap[data] = currentFreq + 1;
57+
58+
// map of frequencies
59+
newFreq = currentFreq + 1;
60+
break;
61+
case __DELETE__:
62+
// map of values
63+
dataMap[data] = Math.max(0, currentFreq - 1);
64+
65+
// map of frequencies
66+
newFreq = currentFreq - 1;
67+
68+
break;
69+
case __SELECT__: {
70+
if (freqMap?.[data]) {
71+
result.push(__FOUND__);
72+
} else {
73+
result.push(__NOT_FOUND__);
74+
}
75+
break;
76+
}
77+
default:
78+
throw new Error('Invalid operation');
79+
}
80+
81+
if (operation === __INSERT__ || operation === __DELETE__) {
82+
updateFrequency(freqMap, data, currentFreq, newFreq);
83+
}
84+
});
85+
86+
return result;
87+
}
88+
89+
export default { freqQuery };

0 commit comments

Comments
 (0)