What if you could count everything once and never count again?
Why Frequency Counter Pattern Using Hash Map in DSA Typescript?
Imagine you have a big box of colored beads and you want to know how many beads of each color you have. Counting each bead one by one every time you want to check is tiring and slow.
Manually counting beads every time means you repeat the same work again and again. It's easy to lose track or make mistakes, especially if the box is big or you need to count many colors.
The frequency counter pattern uses a simple map (like a labeled jar) to keep track of how many beads of each color you have. You count once and store the results, so checking becomes fast and easy.
const beads = ['red', 'blue', 'red', 'green']; let redCount = 0; for (let i = 0; i < beads.length; i++) { if (beads[i] === 'red') redCount++; }
const beads = ['red', 'blue', 'red', 'green']; const frequencyMap: Record<string, number> = {}; for (const color of beads) { frequencyMap[color] = (frequencyMap[color] || 0) + 1; }
This pattern lets you quickly find how many times each item appears, making complex problems simple and fast to solve.
Counting votes in an election where each vote is a name, and you want to know who got how many votes without recounting every time.
Manual counting is slow and error-prone.
Frequency counter uses a map to store counts efficiently.
It makes checking counts fast and easy.
Practice
Solution
Step 1: Understand frequency counting
The frequency counter pattern counts occurrences of each item in a collection.Step 2: Recognize hash map usage
A hash map stores each item as a key and its count as the value for quick lookup.Final Answer:
To count how many times each item appears in a collection -> Option BQuick Check:
Frequency counter = count items [OK]
- Confusing frequency counting with sorting
- Thinking it removes duplicates instead of counting
- Assuming it reverses arrays
Solution
Step 1: Identify correct hash map initialization
In TypeScript, an object with string keys and number values is used for frequency counting.Step 2: Check each option
const freq: Record = {}; uses Record = {} which is correct. Others are array, set, or number, which are incorrect for frequency counting.Final Answer:
const freq: Record = {}; -> Option CQuick Check:
Empty object for frequency map [OK]
- Using array or set instead of object
- Initializing frequency counter as a number
- Not specifying key-value structure
const arr = ['a', 'b', 'a', 'c', 'b', 'a'];
const freq: Record = {};
for (const char of arr) {
freq[char] = (freq[char] || 0) + 1;
}
console.log(freq);Solution
Step 1: Loop through array and count frequencies
Each character's count is incremented in freq. 'a' appears 3 times, 'b' 2 times, 'c' 1 time.Step 2: Output the freq object
console.log prints the object with counts: {"a": 3, "b": 2, "c": 1}.Final Answer:
{"a": 3, "b": 2, "c": 1} -> Option AQuick Check:
Count each char correctly [OK]
- Printing array instead of object
- Not initializing counts to zero
- Trying to iterate freq as array
const str = "hello";
const freq: Record = {};
for (let i = 0; i <= str.length; i++) {
const char = str[i];
freq[char] = (freq[char] || 0) + 1;
}
console.log(freq);Solution
Step 1: Check loop boundary
The loop runs from i = 0 to i <= str.length, which accesses str[str.length] (undefined).Step 2: Fix loop condition
Change condition to i < str.length to avoid accessing undefined character.Final Answer:
Loop condition should be i < str.length, not i <= str.length -> Option DQuick Check:
Loop index must be less than length [OK]
- Using <= instead of < in loop condition
- Initializing freq as array instead of object
- Declaring variables outside loop unnecessarily
arr1 and arr2, which TypeScript function correctly uses the frequency counter pattern to check if arr2 contains the squares of all elements in arr1 with the same frequency?Solution
Step 1: Build frequency maps for both arrays
freq1 counts elements in arr1, freq2 counts elements in arr2.Step 2: Check if freq2 has squares of keys in freq1 with same counts
Loop over freq1 keys, verify freq2 has key squared with equal frequency.Step 3: Return true if all match, else false
If any mismatch found, return false; otherwise, return true.Final Answer:
Function in Option A correctly implements frequency counter for squares check -> Option AQuick Check:
Compare frequencies of numbers and their squares [OK]
- Not comparing frequencies, only presence
- Checking squares incorrectly (num * num vs key squared)
- Ignoring frequency counts in second array
Ready to prove it?
Pass the test and this pattern moves unknown
