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)

1
export function somaDireta(a, b) {
2
  return a + b;
3
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Soma simples (for...of + retorno)

1
export function soma(arr) {
2
  let total = 0;
3
  for (const n of arr) total += n;
4
  return total;
5
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Escopo de bloco (let/const)

1
export function escopo() {
2
  let x = 1;
3
  if (true) {
4
    let x = 2;
5
  }
6
  return x;
7
}

Clique em uma linha destacada para ver o motivo daquela escolha.

const vs let (rebind vs mutação)

1
export function exemploConstLet() {
2
  const cfg = { v: 1 };
3
  let x = 1;
4
  x = 2;
5
  cfg.v = 3;
6
  return [x, cfg.v];
7
}

Clique em uma linha destacada para ver o motivo daquela escolha.

=== vs == (igualdade estrita)

1
export function compara(a, b) {
2
  return [a === b, a == b];
3
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Truthy/Falsy (compact ideia)

1
export function compactIdea(arr) {
2
  const out = [];
3
  for (const v of arr) {
4
    if (v) out.push(v);
5
  }
6
  return out;
7
}

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

1
export function demoSliceSplice(a) {
2
  const copia = a.slice(1, 3);
3
  a.splice(1, 1);
4
  return { copia, a };
5
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Encontrar elemento (loop simples)

1
export function contem(arr, x) {
2
  for (const v of arr) {
3
    if (v === x) return true;
4
  }
5
  return false;
6
}

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

1
export function normalize(s) {
2
  return s.trim().toLowerCase();
3
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Filtrar alfanuméricos

1
export function onlyAlnum(s) {
2
  let out = "";
3
  for (const ch of s) {
4
    if (/[a-z0-9]/i.test(ch)) out += ch;
5
  }
6
  return out;
7
}

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

1
export function contarFrequencia(array) {
2
  const freq = new Map();
3
 
4
  for (const item of array) {
5
    const atual = freq.get(item) ?? 0;
6
    freq.set(item, atual + 1);
7
  }
8
 
9
  return freq;
10
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Primeiro caractere único (ideia)

1
export function firstUniqIdea(s) {
2
  const freq = new Map();
3
  for (const ch of s) freq.set(ch, (freq.get(ch) ?? 0) + 1);
4
  for (let i = 0; i < s.length; i++) {
5
    if (freq.get(s[i]) === 1) return i;
6
  }
7
  return -1;
8
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Two Sum com Map (ideia)

1
export function twoSumIdea(nums, target) {
2
  const idx = new Map();
3
  for (let i = 0; i < nums.length; i++) {
4
    const v = nums[i];
5
    const need = target - v;
6
    if (idx.has(need)) return [idx.get(need), i];
7
    idx.set(v, i);
8
  }
9
  return null;
10
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Contains Duplicate com Set (ideia)

1
export function hasDuplicate(nums) {
2
  const seen = new Set();
3
  for (const n of nums) {
4
    if (seen.has(n)) return true;
5
    seen.add(n);
6
  }
7
  return false;
8
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Valid Anagram (contagem balanceada)

1
export function isAnagramIdea(s, t) {
2
  if (s.length !== t.length) return false;
3
  const freq = new Map();
4
  for (const ch of s) freq.set(ch, (freq.get(ch) ?? 0) + 1);
5
  for (const ch of t) {
6
    const c = (freq.get(ch) ?? 0) - 1;
7
    if (c < 0) return false;
8
    freq.set(ch, c);
9
  }
10
  return true;
11
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Um passe (acumuladores)

Quando dá para resolver varrendo uma única vez, acompanhando mínimos, máximos ou contadores.

Max Profit (acompanhar mínimo)

1
export function maxProfit(prices) {
2
  let min = Infinity;
3
  let best = 0;
4
  for (const p of prices) {
5
    min = Math.min(min, p);
6
    best = Math.max(best, p - min);
7
  }
8
  return best;
9
}

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

1
export function stackOps(ops) {
2
  const st = [];
3
  for (const op of ops) {
4
    if (op.type === "push") st.push(op.value);
5
    else if (op.type === "pop") st.pop();
6
  }
7
  return st;
8
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Valid Parentheses (stack)

1
export function isValidParensIdea(s) {
2
  const st = [];
3
  const pairs = { ")": "(", "]": "[", "}": "{" };
4
  for (const ch of s) {
5
    if (ch in pairs) {
6
      if (st.pop() !== pairs[ch]) return false;
7
    } else {
8
      st.push(ch);
9
    }
10
  }
11
  return st.length === 0;
12
}

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)

1
export function moveZeroes(nums) {
2
  let write = 0;
3
 
4
  for (let i = 0; i < nums.length; i++) {
5
    if (nums[i] !== 0) {
6
      nums[write] = nums[i];
7
      write++;
8
    }
9
  }
10
 
11
  while (write < nums.length) {
12
    nums[write] = 0;
13
    write++;
14
  }
15
 
16
  return nums;
17
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Remover duplicados (array ordenado)

1
export function uniqueSorted(nums) {
2
  if (nums.length === 0) return [];
3
  const out = [nums[0]];
4
  for (let i = 1; i < nums.length; i++) {
5
    if (nums[i] !== nums[i - 1]) out.push(nums[i]);
6
  }
7
  return out;
8
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Is Subsequence (dois ponteiros)

1
export function isSubseqIdea(s, t) {
2
  let i = 0;
3
  for (const ch of t) {
4
    if (i < s.length && s[i] === ch) i++;
5
  }
6
  return i === s.length;
7
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Palíndromo (ignorando não alfanumérico)

1
export function isPalindromeIdea(s) {
2
  let i = 0;
3
  let j = s.length - 1;
4
  while (i < j) {
5
    while (i < j && !/[a-z0-9]/i.test(s[i])) i++;
6
    while (i < j && !/[a-z0-9]/i.test(s[j])) j--;
7
    if (s[i].toLowerCase() !== s[j].toLowerCase()) return false;
8
    i++;
9
    j--;
10
  }
11
  return true;
12
}

Clique em uma linha destacada para ver o motivo daquela escolha.

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

1
export function maxAvg(nums, k) {
2
  if (nums.length < k) return -Infinity;
3
  let sum = 0;
4
  for (let i = 0; i < k; i++) sum += nums[i];
5
  let best = sum;
6
  for (let i = k; i < nums.length; i++) {
7
    sum += nums[i] - nums[i - k];
8
    if (sum > best) best = sum;
9
  }
10
  return best / k;
11
}

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'

1
export function filtra(nums, predicate) {
2
  const out = [];
3
  for (const n of nums) {
4
    if (predicate === "even" && n % 2 === 0) out.push(n);
5
    else if (predicate === "odd" && n % 2 !== 0) out.push(n);
6
  }
7
  return out;
8
}

Clique em uma linha destacada para ver o motivo daquela escolha.

Comparar após normalizar tipo

1
export function isEqualNumberLike(a, b) {
2
  const na = Number(a);
3
  const nb = Number(b);
4
  if (Number.isNaN(na) || Number.isNaN(nb)) return false;
5
  return na === nb;
6
}

Clique em uma linha destacada para ver o motivo daquela escolha.

toNumber seguro (sem NaN)

1
export function toNumberSafe(x, fallback = 0) {
2
  const n = Number(x);
3
  return Number.isFinite(n) ? n : fallback;
4
}

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 →