Guia Junior
Primeiro você faz os treinos (entender o porquê do código). Depois você faz exercícios no compilador e só avança quando passar nos testes.
Treinos
Fundamentos de JavaScript para entrevistas
Progressão natural: expressões aritméticas → variáveis → igualdade → loops → função com retorno.
Operadores e expressões (soma direta, sem variáveis)
export function somaDireta(a, b) { return a + b;}Clique em uma linha destacada para ver o motivo daquela escolha.
Soma simples (for...of + retorno)
export function soma(arr) { let total = 0; for (const n of arr) total += n; return total;}Clique em uma linha destacada para ver o motivo daquela escolha.
Escopo de bloco (let/const)
export function escopo() { let x = 1; if (true) { let x = 2; } return x;}Clique em uma linha destacada para ver o motivo daquela escolha.
const vs let (rebind vs mutação)
export function exemploConstLet() { const cfg = { v: 1 }; let x = 1; x = 2; cfg.v = 3; return [x, cfg.v];}Clique em uma linha destacada para ver o motivo daquela escolha.
=== vs == (igualdade estrita)
export function compara(a, b) { return [a === b, a == b];}Clique em uma linha destacada para ver o motivo daquela escolha.
Truthy/Falsy (compact ideia)
export function compactIdea(arr) { const out = []; for (const v of arr) { if (v) out.push(v); } return out;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Arrays (métodos essenciais e iteração)
Aprenda push/pop/shift/unshift e a diferença entre slice (cópia) e splice (mutação).
slice vs splice
export function demoSliceSplice(a) { const copia = a.slice(1, 3); a.splice(1, 1); return { copia, a };}Clique em uma linha destacada para ver o motivo daquela escolha.
Encontrar elemento (loop simples)
export function contem(arr, x) { for (const v of arr) { if (v === x) return true; } return false;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Strings (limpeza e normalização)
Strings são imutáveis: prefira criar novas strings e normalizar entrada.
Normalizar entrada
export function normalize(s) { return s.trim().toLowerCase();}Clique em uma linha destacada para ver o motivo daquela escolha.
Filtrar alfanuméricos
export function onlyAlnum(s) { let out = ""; for (const ch of s) { if (/[a-z0-9]/i.test(ch)) out += ch; } return out;}Clique em uma linha destacada para ver o motivo daquela escolha.
Hash Map (Map) para sair de O(n²) para O(n)
O padrão mais comum em entrevista: trocar comparação dupla por uma estrutura de acesso rápido (Map/Set).
Contagem de frequência com Map
export function contarFrequencia(array) { const freq = new Map(); for (const item of array) { const atual = freq.get(item) ?? 0; freq.set(item, atual + 1); } return freq;}Clique em uma linha destacada para ver o motivo daquela escolha.
Primeiro caractere único (ideia)
export function firstUniqIdea(s) { const freq = new Map(); for (const ch of s) freq.set(ch, (freq.get(ch) ?? 0) + 1); for (let i = 0; i < s.length; i++) { if (freq.get(s[i]) === 1) return i; } return -1;}Clique em uma linha destacada para ver o motivo daquela escolha.
Two Sum com Map (ideia)
export function twoSumIdea(nums, target) { const idx = new Map(); for (let i = 0; i < nums.length; i++) { const v = nums[i]; const need = target - v; if (idx.has(need)) return [idx.get(need), i]; idx.set(v, i); } return null;}Clique em uma linha destacada para ver o motivo daquela escolha.
Contains Duplicate com Set (ideia)
export function hasDuplicate(nums) { const seen = new Set(); for (const n of nums) { if (seen.has(n)) return true; seen.add(n); } return false;}Clique em uma linha destacada para ver o motivo daquela escolha.
Valid Anagram (contagem balanceada)
export function isAnagramIdea(s, t) { if (s.length !== t.length) return false; const freq = new Map(); for (const ch of s) freq.set(ch, (freq.get(ch) ?? 0) + 1); for (const ch of t) { const c = (freq.get(ch) ?? 0) - 1; if (c < 0) return false; freq.set(ch, c); } return true;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Um passe (acumuladores)
Quando dá para resolver varrendo uma única vez, acompanhando mínimos, máximos ou contadores.
Max Profit (acompanhar mínimo)
export function maxProfit(prices) { let min = Infinity; let best = 0; for (const p of prices) { min = Math.min(min, p); best = Math.max(best, p - min); } return best;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Stack e Queue com Array
Use push/pop para Stack e push/shift para Queue em problemas introdutórios.
Stack mínima
export function stackOps(ops) { const st = []; for (const op of ops) { if (op.type === "push") st.push(op.value); else if (op.type === "pop") st.pop(); } return st;}Clique em uma linha destacada para ver o motivo daquela escolha.
Valid Parentheses (stack)
export function isValidParensIdea(s) { const st = []; const pairs = { ")": "(", "]": "[", "}": "{" }; for (const ch of s) { if (ch in pairs) { if (st.pop() !== pairs[ch]) return false; } else { st.push(ch); } } return st.length === 0;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Dois ponteiros (array in-place)
Quando a ordem importa e você quer O(n) sem criar outro array grande, dois ponteiros resolvem muita coisa.
Move Zeroes (idéia)
export function moveZeroes(nums) { let write = 0; for (let i = 0; i < nums.length; i++) { if (nums[i] !== 0) { nums[write] = nums[i]; write++; } } while (write < nums.length) { nums[write] = 0; write++; } return nums;}Clique em uma linha destacada para ver o motivo daquela escolha.
Remover duplicados (array ordenado)
export function uniqueSorted(nums) { if (nums.length === 0) return []; const out = [nums[0]]; for (let i = 1; i < nums.length; i++) { if (nums[i] !== nums[i - 1]) out.push(nums[i]); } return out;}Clique em uma linha destacada para ver o motivo daquela escolha.
Is Subsequence (dois ponteiros)
export function isSubseqIdea(s, t) { let i = 0; for (const ch of t) { if (i < s.length && s[i] === ch) i++; } return i === s.length;}Clique em uma linha destacada para ver o motivo daquela escolha.
Palíndromo (ignorando não alfanumérico)
export function isPalindromeIdea(s) { let i = 0; let j = s.length - 1; while (i < j) { while (i < j && !/[a-z0-9]/i.test(s[i])) i++; while (i < j && !/[a-z0-9]/i.test(s[j])) j--; if (s[i].toLowerCase() !== s[j].toLowerCase()) return false; i++; j--; } return true;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Sliding Window (janela fixa)
Troque loops aninhados por uma janela de tamanho fixo que se move uma posição por vez.
Max average com janela de tamanho k
export function maxAvg(nums, k) { if (nums.length < k) return -Infinity; let sum = 0; for (let i = 0; i < k; i++) sum += nums[i]; let best = sum; for (let i = k; i < nums.length; i++) { sum += nums[i] - nums[i - k]; if (sum > best) best = sum; } return best / k;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Tipos e Truthy/Falsy (aprofundado)
Aprenda a diferenciar valores falsy, normalizar tipos antes de comparar e aplicar filtros com 'predicates'.
Filtro por predicate 'even'/'odd'
export function filtra(nums, predicate) { const out = []; for (const n of nums) { if (predicate === "even" && n % 2 === 0) out.push(n); else if (predicate === "odd" && n % 2 !== 0) out.push(n); } return out;}Clique em uma linha destacada para ver o motivo daquela escolha.
Comparar após normalizar tipo
export function isEqualNumberLike(a, b) { const na = Number(a); const nb = Number(b); if (Number.isNaN(na) || Number.isNaN(nb)) return false; return na === nb;}Clique em uma linha destacada para ver o motivo daquela escolha.
toNumber seguro (sem NaN)
export function toNumberSafe(x, fallback = 0) { const n = Number(x); return Number.isFinite(n) ? n : fallback;}Clique em uma linha destacada para ver o motivo daquela escolha.
Exercícios recomendados desta seção
Exercícios
Compact Array (truthy/falsy)
Função: compact()
Abrir no compilador →
Reverse String
Função: reverseString()
Abrir no compilador →
Count Vowels
Função: countVowels()
Abrir no compilador →
Remover Zeros (filtro simples)
Função: removeZeros()
Abrir no compilador →
Soma do Array (for...of)
Função: sum()
Abrir no compilador →
Find Index (loop simples)
Função: findIndex()
Abrir no compilador →
Reverse Array (novo array)
Função: reverseArray()
Abrir no compilador →
Merge Sorted Arrays
Função: mergeSortedArrays()
Abrir no compilador →
Segundo Maior (tratando duplicados)
Função: secondLargest()
Abrir no compilador →
Primeiro Caractere Único (frequência)
Função: firstUniqChar()
Abrir no compilador →
Primeiro Número Único (frequência)
Função: firstUniqueIndex()
Abrir no compilador →
Two Sum (O(n) com Map)
Função: twoSum()
Abrir no compilador →
Move Zeroes (dois ponteiros)
Função: moveZeroes()
Abrir no compilador →
Contains Duplicate (Set)
Função: containsDuplicate()
Abrir no compilador →
Remover Elemento (dois ponteiros simples)
Função: removeElement()
Abrir no compilador →
Two Sum (array ordenado, dois ponteiros)
Função: twoSumSorted()
Abrir no compilador →
Remover Duplicados (array ordenado)
Função: removeDuplicates()
Abrir no compilador →
Valid Anagram (frequência)
Função: isAnagram()
Abrir no compilador →
Valid Palindrome (dois ponteiros)
Função: isPalindrome()
Abrir no compilador →
Valid Parentheses (Stack)
Função: isValid()
Abrir no compilador →
Máximo de Uns Consecutivos
Função: maxConsecutiveOnes()
Abrir no compilador →
Filtrar Pares/Ímpares por Predicate
Função: filterByPredicate()
Abrir no compilador →
Comparar Após Normalizar Número
Função: equalNumberLike()
Abrir no compilador →
toNumber Seguro com Fallback
Função: toNumberSafe()
Abrir no compilador →
Máxima Média (janela fixa k)
Função: findMaxAverage()
Abrir no compilador →
Best Time to Buy and Sell Stock (um passe)
Função: maxProfit()
Abrir no compilador →
Is Subsequence (dois ponteiros)
Função: isSubsequence()
Abrir no compilador →
Intersection of Two Arrays (Set)
Função: intersection()
Abrir no compilador →