-
Notifications
You must be signed in to change notification settings - Fork 0
Patrones Rust para Entrevista
Joel Alvarez edited this page Jul 12, 2026
·
10 revisions
let mut counts = std::collections::HashMap::new();
for value in values {
*counts.entry(value).or_insert(0) += 1;
}Aplicaciones:
- Anagramas.
- Top K frecuente.
- Conteo de caracteres o números.
let mut seen = std::collections::HashMap::new();
for (index, value) in nums.into_iter().enumerate() {
let complement = target - value;
if let Some(&previous_index) = seen.get(&complement) {
return Some((previous_index, index));
}
seen.insert(value, index);
}Aplicaciones:
- Two Sum.
- Pares con target.
- Detección de relaciones valor-índice.
let values: std::collections::HashSet<i32> = nums.into_iter().collect();
for &value in &values {
if values.contains(&(value - 1)) {
continue;
}
}Aplicaciones:
- Duplicados.
- Secuencias consecutivas.
- Visitados en grafos.
let mut prefix_counts = std::collections::HashMap::from([(0, 1)]);
let mut prefix_sum = 0;
let mut matches = 0;
for value in nums {
prefix_sum += value;
let needed_prefix = prefix_sum - target;
if let Some(count) = prefix_counts.get(&needed_prefix) {
matches += count;
}
*prefix_counts.entry(prefix_sum).or_insert(0) += 1;
}Aplicaciones:
- Contar subarreglos contiguos con una suma objetivo.
- Detectar rangos con suma específica.
- Trabajar con números negativos cuando sliding window ya no aplica.
pub fn find_value(nums: Vec<i32>, target: i32) -> Option<usize> {
for (index, value) in nums.into_iter().enumerate() {
if value == target {
return Some(index);
}
}
None
}Usar Option cuando una respuesta puede no existir. Es más idiomático que devolver -1.
Los mapas no garantizan orden de iteración. Si una función regresa grupos, ordenar antes de comparar:
for group in &mut result {
group.sort();
}
result.sort();let mut left = 0;
let mut right = values.len() - 1;
while left < right {
if should_move_left(values[left], values[right]) {
left += 1;
} else {
right -= 1;
}
}Aplicaciones:
- Palíndromos.
- Pares o tripletas en arreglos ordenados.
- Contenedores o áreas donde los límites importan.
let mut left = 0;
for right in 0..values.len() {
add(values[right]);
while window_is_invalid() {
remove(values[left]);
left += 1;
}
}Aplicaciones:
- Subcadenas sin repetidos.
- Ventanas mínimas con conteos.
- Mejor subarreglo contiguo bajo una condición.
let mut stack: Vec<usize> = Vec::new();
for (index, value) in values.iter().enumerate() {
while let Some(&previous_index) = stack.last() {
if values[previous_index] >= *value {
break;
}
stack.pop();
resolve(previous_index, index);
}
stack.push(index);
}Aplicaciones:
- Siguiente mayor o menor elemento.
- Temperaturas diarias.
- Rectángulos en histogramas.
let mut left = 0;
let mut right = values.len();
while left < right {
let mid = left + (right - left) / 2;
if values[mid] == target {
return Some(mid);
}
if values[mid] < target {
left = mid + 1;
} else {
right = mid;
}
}Aplicaciones:
- Encontrar un índice exacto.
- Buscar posición de inserción.
- Implementar lower bound.
let mut left = minimum_possible_answer;
let mut right = maximum_possible_answer;
while left < right {
let mid = left + (right - left) / 2;
if works(mid) {
right = mid;
} else {
left = mid + 1;
}
}Aplicaciones:
- Encontrar la mínima velocidad que cumple un límite.
- Encontrar la mínima capacidad que cumple una fecha límite.
- Optimizar una respuesta cuando la condición es monótona.
fn backtrack(state: &mut Vec<i32>, result: &mut Vec<Vec<i32>>) {
if is_complete(state) {
result.push(state.clone());
return;
}
for choice in choices() {
state.push(choice);
backtrack(state, result);
state.pop();
}
}Aplicaciones:
- Subconjuntos.
- Permutaciones.
- Combinaciones.
- Generación de paréntesis.
- Búsqueda DFS con restauración de estado.
let mut previous = None;
while let Some(mut node) = head {
head = node.next.take();
node.next = previous;
previous = Some(node);
}Aplicaciones:
- Revertir listas enlazadas.
- Fusionar listas ordenadas.
- Reordenar listas.
- Practicar ownership explícito en Rust.