Exercício 1
Encontre a primeira ocorrência
stub.rs
// linear_search devolve o índice da primeira ocorrência de target.
pub fn linear_search(values: &[i32], target: i32) -> Option<usize> {
// implemente:
let _ = (values, target);
None
}
harness.rs
fn json_escape(value: &str) -> String {
value
.replace('\\', "\\\\")
.replace('"', "\\\"")
.replace('\n', "\\n")
}
fn print_result(case: usize, pass: bool, input: &str, want: &str, got: &str) {
println!(
"RESULT {{\"case\":{case},\"pass\":{pass},\"input\":\"{}\",\"want\":\"{}\",\"got\":\"{}\"}}",
json_escape(input),
json_escape(want),
json_escape(got)
);
}
fn main() {
let cases: &[(&[i32], i32, &str, Option<usize>)] = &[
(&[4, 7, 1, 9], 1, "values=[4,7,1,9], target=1", Some(2)),
(&[4, 7, 1, 9], 5, "values=[4,7,1,9], target=5", None),
(&[3, 3, 3], 3, "values=[3,3,3], target=3", Some(0)),
(&[], 8, "values=[], target=8", None),
(
&[i32::MIN],
i32::MIN,
"values=[-2147483648], target=-2147483648",
Some(0),
),
];
for (index, &(values, target, input, want)) in cases.iter().enumerate() {
let got = linear_search(values, target);
print_result(
index + 1,
got == want,
input,
&format!("{want:?}"),
&format!("{got:?}"),
);
}
}
cases.json
[
{
"case": 1,
"input": "values=[4,7,1,9], target=1",
"want": "Some(2)"
},
{
"case": 2,
"input": "values=[4,7,1,9], target=5",
"want": "None"
},
{
"case": 3,
"input": "values=[3,3,3], target=3",
"want": "Some(0)"
},
{
"case": 4,
"input": "values=[], target=8",
"want": "None"
},
{
"case": 5,
"input": "values=[-2147483648], target=-2147483648",
"want": "Some(0)"
}
]
Casos e valores esperados
| Caso | Entrada | Valor esperado |
|---|---|---|
| 1 | values=[4,7,1,9], target=1 |
Some(2) |
| 2 | values=[4,7,1,9], target=5 |
None |
| 3 | values=[3,3,3], target=3 |
Some(0) |
| 4 | values=[], target=8 |
None |
| 5 | values=[-2147483648], target=-2147483648 |
Some(0) |
Execute com o Cargo local
- Execute os comandos de preparação.
- Copie os arquivos acima para os arquivos vazios com os mesmos nomes.
- Execute a verificação de base. O stub deve mostrar o comportamento atual.
Comandos de preparação
cargo new --bin --edition 2024 entrevistas-01-mapa-de-padroes-exercicio-1
cd entrevistas-01-mapa-de-padroes-exercicio-1
touch stub.rs harness.rs cases.json
printf 'include!("../stub.rs");\ninclude!("../harness.rs");\n' > src/main.rs
Verificação de base — confirme o comportamento atual antes da mudança
cargo fmt --check
cargo run --bin entrevistas-01-mapa-de-padroes-exercicio-1
cargo clippy -- -D warnings
Mostrar dicas
- Percorra a fatia por referência e pare na primeira igualdade; o índice faz parte do resultado.
- O método position de Iterator devolve Option<usize> e já preserva a primeira ocorrência.
Revelar solução
solution.rs
// linear_search devolve o índice da primeira ocorrência de target.
pub fn linear_search(values: &[i32], target: i32) -> Option<usize> {
values.iter().position(|&value| value == target)
}
Uma passagem com position devolve a primeira ocorrência em O(n), não move a fatia e cobre a entrada vazia com None.