Skip to content

Commit 2ef0205

Browse files
author
Gonzalo Diaz
committed
[REFACTOR] [Hacker Rank] Interview Preparation Kit: Dictionaries and Hashmaps: Frequency Queries. First solution and optimized solution splitted in two separated solutions.
1 parent 12e11f0 commit 2ef0205

File tree

6 files changed

+168
-95
lines changed

6 files changed

+168
-95
lines changed

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

Lines changed: 0 additions & 95 deletions
This file was deleted.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/**
2+
* @link Problem definition [[docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/frequency-queries.md]]
3+
*/
4+
5+
export function freqQuery(queries) {
6+
const result = [];
7+
const dataMap = {};
8+
9+
const __INITIAL__ = 0;
10+
const __INSERT__ = 1;
11+
const __DELETE__ = 2;
12+
const __SELECT__ = 3;
13+
14+
const __NOT_FOUND__ = 0;
15+
const __FOUND__ = 1;
16+
17+
queries.forEach((query) => {
18+
const [operation, data] = query;
19+
20+
const current = dataMap?.[data] ?? __INITIAL__;
21+
22+
switch (operation) {
23+
case __INSERT__:
24+
dataMap[data] = current + 1;
25+
break;
26+
case __DELETE__:
27+
dataMap[data] = Math.max(0, current - 1);
28+
break;
29+
case __SELECT__: {
30+
const uniqueDatavalues = new Set(Object.values(dataMap));
31+
if (uniqueDatavalues.has(data)) {
32+
result.push(__FOUND__);
33+
} else {
34+
result.push(__NOT_FOUND__);
35+
}
36+
break;
37+
}
38+
default:
39+
throw new Error('Invalid operation');
40+
}
41+
});
42+
43+
return result;
44+
}
45+
46+
export default { freqQuery };
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.js';
3+
4+
import { freqQuery } from './frequency_queries_bruteforce.js';
5+
import SMALL_TEST_CASES from './frequency_queries_testcases.json';
6+
7+
describe('frequency_queries', () => {
8+
it('freqQuery test cases', () => {
9+
expect.assertions(4);
10+
11+
SMALL_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: 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.js';
3+
4+
import { freqQuery } from './frequency_queries_optimized.js';
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: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
[
2+
{
3+
"title": "Sample Test Case 0",
4+
"input": [
5+
[1, 5],
6+
[1, 6],
7+
[3, 2],
8+
[1, 10],
9+
[1, 10],
10+
[1, 6],
11+
[2, 5],
12+
[3, 2]
13+
],
14+
"expected": [0, 1]
15+
},
16+
{
17+
"title": "Sample Test Case 1",
18+
"input": [
19+
[3, 4],
20+
[2, 1003],
21+
[1, 16],
22+
[3, 1]
23+
],
24+
"expected": [0, 1]
25+
},
26+
{
27+
"title": "Sample Test Case 2",
28+
"input": [
29+
[1, 3],
30+
[2, 3],
31+
[3, 2],
32+
[1, 4],
33+
[1, 5],
34+
[1, 5],
35+
[1, 4],
36+
[3, 2],
37+
[2, 4],
38+
[3, 2]
39+
],
40+
"expected": [0, 1, 1]
41+
},
42+
{
43+
"title": "Sample Test Case 3",
44+
"input": [
45+
[1, 3],
46+
[1, 38],
47+
[2, 1],
48+
[1, 16],
49+
[2, 1],
50+
[2, 2],
51+
[1, 64],
52+
[1, 84],
53+
[3, 1],
54+
[1, 100],
55+
[1, 10],
56+
[2, 2],
57+
[2, 1],
58+
[1, 67],
59+
[2, 2],
60+
[3, 1],
61+
[1, 99],
62+
[1, 32],
63+
[1, 58],
64+
[3, 2]
65+
],
66+
"expected": [1, 1, 0]
67+
}
68+
]

0 commit comments

Comments
 (0)