Common Coding Interview Problems & their Most Optimal Solutions
Language: JavaScript
Count the number of occurrences for each charater in a string and sort the results
In this coding problem, you are given a list of values (can be strings, numbers, etc.) and you are asked to determine most frequently occoring item in the list, the second most frequently occuring item, and so on. Here are 5 possible solutions, ordered from least to highest performant.
ES3 - Nested for loops
const list = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3]; const countArray = []; const uniqueList = []; let matchCount; for (let i = 0; i < list.length; i++) { matchCount = 1; item = list[i]; if (uniqueList.includes(item)) { continue; } uniqueList.push(item); for (let j = i + 1; j < list.length; j++) { if (item == list[j]) { matchCount++; } } countArray.push({name: item, count: matchCount}); } countArray.sort((a, b) => { return b.count - a.count; }); console.log(countArray);
ES5 - conditional (ternary) operator
const list = [3, 'a', 'a', 'a', 2, 3, 'a', 3, 'a', 2, 4, 9, 3]; const counts = {}; for (let i = 0; i < list.length; i++) { let item = list[i]; counts[item] = counts[item] ? {name: item, count: counts[item].count + 1 } : {name: item, count: 1}; } const countArray = Object.values(counts); countArray.sort((a, b) => { return b.count - a.count; }); console.log(countArray);
ES6 - forEach
const string = "Can you count how many or each character?" // 1 - split / spread the string const charArray = [...string] // string.split('') // 2 - iterate over each character const counts = {} charArray.forEach(char => { counts[char] = counts[char] ? ++counts[char] : 1 }) // 3 - Sort the array const sortable = Object.entries(counts) sortable.sort((a,b) => a[1] - b[1]) // 4 - Restore to the object const sortedObject = {} sortable.forEach(charEntry => { sortedObject[charEntry[0]] = charEntry[1] }) console.log(sortedObject)
ES7 - reduce
const string = "Can you count how many or each character?" // 1 - iterate over each character const counts = [...string].reduce((accum, char) => { accum[char] = accum[char] ? ++accum[char] : 1 return accum }, {}) // 2 - Sort the array const sortable = Object.entries(counts) sortable.sort((a,b) => a[1] - b[1]) // 3 - Restore to the object const sortedObject = {} sortable.forEach(charEntry => { sortedObject[charEntry[0]] = charEntry[1] }) console.log(sortedObject)
Flood Fill
Problem: Given a grid, location of a pixel in the screen and a color, replace color of the given pixel and all adjacent same colored pixels with the given color.
Solution
const matrix = [ [{color: 'green'},{color: 'green'}, {color: 'green'}], [{color: 'blue'}, {color: 'blue'}, {color: 'green'}], [{color: 'blue'}, {color: 'green'}, {color: 'green'}] ]; const floodfill = (x, y, oldColor, newColor) => { let theStack = [{x, y}] while (theStack.length > 0) { let {x, y} = theStack.pop(); if (!matrix[x] || !matrix[x][y] || matrix[x][y].color != oldColor) { continue; } matrix[x][y].color = newColor; theStack.push( { x: x + 1, y } ); // right theStack.push( { x: x - 1, y } ); // left theStack.push( { x, y: y + 1 } ); // down theStack.push( { x, y: y - 1 } ); // up } } floodfill(0, 0, 'green', 'red'); console.log("Matrix green is now red:"); console.log(matrix);
Maximum Number of Connected Colors
Problem: Given a grid, find the maximum number of connected colors.
Solution
const matrix = [ [{color: 'green'},{color: 'green'}, {color: 'green'}], [{color: 'blue'}, {color: 'blue'}, {color: 'green'}], [{color: 'blue'}, {color: 'green'}, {color: 'green'}] ]; const floodFillCount = (x, y, color) => { let cnt = 0; const stack = [{x, y}]; while (stack.length > 0) { const {x, y} = stack.pop(); if (!matrix[x] || !matrix[x][y] || matrix[x][y].color !== color || matrix[x][y].counted) { continue; } cnt++; matrix[x][y].counted = true; stack.push({x: x - 1, y}); stack.push({x: x + 1, y}); stack.push({x, y: y - 1}); stack.push({x, y: y + 1}); } return cnt; } console.log(floodFillCount(0, 0, 'green'));