Skip to content

Commit 6155a49

Browse files
Merge pull request #206 from TheGeniusOfEternity/feature/interview/group-numbers
Feat | Interview | #15 Group Numbers
2 parents bad2941 + 9b31bb8 commit 6155a49

3 files changed

Lines changed: 115 additions & 1 deletion

File tree

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,5 @@ Interview Questions
133133
- [Task #11](src/interview/build-tree/no-replies-sort) - _Build Tree: No Replies Sort_
134134
- [Task #12](src/interview/build-tree/with-replies-sort) - _Build Tree: With Replies Sort_
135135
- [Task #13](src/interview/build-comments-tree) - _Build Comments Tree_
136-
- [Task #13](src/interview/find-by-type) - _Find By Type_
136+
- [Task #13](src/interview/find-by-type) - _Find By Type_
137+
- [Task #14](src/interview/group-numbers) - _Group Numbers_
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { groupNumbers } from './solution';
2+
3+
describe('Group Numbers | Interview | Testcases', () => {
4+
test('#1 Groups numbers with same digit multiset (ignoring zeros)', () => {
5+
const numbers = [123, 321, 1023, 3201, 112, 12];
6+
const result = groupNumbers(numbers);
7+
expect(result).toEqual([[123, 321, 1023, 3201], [112], [12]]);
8+
});
9+
10+
test('#2 Handles empty array', () => {
11+
expect(groupNumbers([])).toEqual([]);
12+
});
13+
14+
test('#3 Single number – one group', () => {
15+
expect(groupNumbers([42])).toEqual([[42]]);
16+
});
17+
18+
test('#4 Numbers with zeros are grouped correctly', () => {
19+
const numbers = [101, 110, 11, 1001];
20+
// 101 → digits {1,1} (zeros ignored) → "11"
21+
// 110 → digits {1,1} → "11"
22+
// 11 → digits {1,1} → "11"
23+
// 1001 → digits {1,1} → "11"
24+
expect(groupNumbers(numbers)).toEqual([[101, 110, 11, 1001]]);
25+
});
26+
27+
test('#5 Different digit counts -> different groups', () => {
28+
const numbers = [12, 122, 112];
29+
// 12 → "12"
30+
// 122 → "122" (two 2s, one 1)
31+
// 112 → "112" (two 1s, one 2)
32+
expect(groupNumbers(numbers)).toEqual([[12], [122], [112]]);
33+
});
34+
35+
test('#6 Preserves input order within groups', () => {
36+
const numbers = [321, 123, 213, 321];
37+
const result = groupNumbers(numbers);
38+
expect(result).toEqual([[321, 123, 213, 321]]);
39+
});
40+
41+
test('#7 Groups with same digits but different zeros', () => {
42+
const numbers = [105, 501, 150, 51];
43+
// 105 → "15"
44+
// 501 → "15"
45+
// 150 → "15"
46+
// 51 → "15"
47+
expect(groupNumbers(numbers)).toEqual([[105, 501, 150, 51]]);
48+
});
49+
50+
test('#8 Groups appear in order of first occurrence', () => {
51+
const numbers = [99, 123, 90009, 1032, 45, 54];
52+
// 99 → "99"
53+
// 123 → "123"
54+
// 90009 → "99"
55+
// 1032 → "123"
56+
// 45 → "45"
57+
// 54 → "45"
58+
expect(groupNumbers(numbers)).toEqual([
59+
[99, 90009],
60+
[123, 1032],
61+
[45, 54],
62+
]);
63+
});
64+
});
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/**
2+
* Groups nums by multiset of digits (except zero)
3+
* @param numbers - array of positive integers
4+
* @returns array of groups
5+
*
6+
* @example
7+
*
8+
* 123 -> 123
9+
* 1032 -> 123
10+
* 99 -> 99
11+
* 90009 -> 99
12+
*
13+
* const numbers = [99, 123, 90009, 1032, 45, 54];
14+
* const snapshot = [...numbers];
15+
*
16+
* console.log(groupNumbersByDigits(numbers));
17+
* // Expected:
18+
* // [
19+
* // [99, 90009],
20+
* // [123, 1032],
21+
* // [45, 54]
22+
* // ]
23+
*
24+
* console.log(numbers);
25+
* Must be unchanged [99, 123, 90009, 1032, 45, 54]
26+
*/
27+
export const groupNumbers = (numbers: number[]): number[][] => {
28+
const result: number[][] = [];
29+
const groups = new Map<string, number[]>();
30+
for (const num of numbers) {
31+
const count = new Array<number>(10).fill(0);
32+
for (const d of num.toString()) {
33+
if (d !== '0') {
34+
count[Number(d)]++;
35+
}
36+
}
37+
const key = count.join(',');
38+
if (!groups.has(key)) {
39+
groups.set(key, []);
40+
}
41+
groups.get(key)?.push(num);
42+
}
43+
44+
for (const [, group] of groups) {
45+
result.push(group);
46+
}
47+
48+
return result;
49+
};

0 commit comments

Comments
 (0)