Vecのnewやpushなど普通にcollectに任せる手もあるね
条件付き挿入は汎用にOptionで取捨を示してflat_mapとflattenでも可能
前値など状態を保ちつつ1つにまとめるならfoldでイテレータに流すならscan
一例としてこんな感じ

fn f(input: &[u8]) -> Vec<u8> {
 input
  .iter()
  .scan(None, |pre, &x| {
   Some([
    pre.replace(x & 1)
     .and_then(|p| (p == x & 1).then_some(p + b'0')),
    Some(x),
   ])
  })
  .flat_map(|list| list.into_iter().flatten())
  .collect()
}

>>640
Rust