языке сейчас), поэтому будет джуновский вопрос.
Решаю задачки на кодеварс и столкнулся с такой.
На вход даётся массив с последовательностью цифр от 1 и т.д. по порядку.
Нужно написать функцию, которая бы могла найти пропуск, то есть массив [1, 2, 3, 4, 5, 7], есть пропуск и нужно вернуть 7, а если пропуска нет, то None.
Вот мой код, который не работает из-за несовпадения типов, может кто подсказать как пофиксить?
fn first_non_consecutive(vec: &Vec<i32>) -> Option<i32> {
for i in 1..vec.len()-1 {
if vec.iter().nth(i+1).unwrap() - vec.iter().nth(i).unwrap() != 1 {
return vec.iter().nth(i+1);
} else { return None; };
};
}
.iter().nth(i).unwrap() можно на [i] поменять
fn first_non_consecutive(vec: &Vec<i32>) -> Option<i32> { for i in 0..vec.len()-1 { if vec.get(i+1).unwrap() - vec.get(i).unwrap() != 1 { return vec.get(i+1).copied(); }; }; return None; } Вот так по итогу сделал. Спасибо!
если тебе не нужны проверки, есть ли элемент, то можно чуть переделать fn first_non_consecutive(vec: &Vec<i32>) -> Option<i32> { for i in 0..vec.len()-1 { if vec[i + 1] - vec[i] != 1 { return *vec[i]; } } return None; }
type i32 cannot be dereferenced
vec.iter().windows(2).find(|w| w[0] != w[1]).map(|w| w[1])
fn first_non_consecutive(arr: &Vec<i32>) -> Option<i32> { arr.windows(2).find_map(|w| { let prev = w[0]; let next = w[1]; if prev + 1 != next { Some(next) } else { None } }) }
О, спасибо, не знал
А зачем переменные ставить?
Это я для читаемости первую вынес, а вторую просто чтобы два раза не обращаться
Обсуждают сегодня