扑克牌:字节

假设有一堆扑克牌,做两个操作,首先从牌顶拿一张到桌子上,然后牌顶拿一张到牌底
一直重复直至没排,给定桌子上的牌,问原本的一堆牌是什么。
这一题是纯粹的逆向思维的题,但是我没做好:
过程如下:

  1. 考虑原本的是 1,2,3,4,5,6,7
  2. 那么过程就是:{
  3. {注意思考方式:[out]: remain}
  4. [1] 2 3 4 5 6 7
  5. [3] 4 5 6 7 2
  6. [5] 6 7 2 4
  7. [7] 2 4 6
  8. [4] 6 2
  9. [2] 6
  10. }
  11. 我之前想破脑袋也没想完全这个逆向的过程,其实画了这个图之后就可以看出来
  12. 首先就是,使用一个双端队列
  13. 将最后的两位正确的保存
  14. 然后桌面上左端出一个
  15. 结果就是前面加一个,然后挪动一个,核心的翻转的思想就是,构建每一次的remain
  16. 即:
  17. 初始构建 6 2
  18. 4 4 6 2 -> 2 4 6
  19. 7 7 2 4 6 -> 6 7 2 4
  20. ...
  21. 代码:
  22. fn main() {
  23. let mut test = VecDeque::from([1, 3, 5, 7, 4, 2, 6]);
  24. let deque = original(&mut test);
  25. println!("{:?}", deque);
  26. }
  27. fn original(input: &mut VecDeque<i32>) -> VecDeque<i32> {
  28. if input.len() <= 2 { return input.clone() }
  29. let mut res = VecDeque::with_capacity(input.len());
  30. res.push_back(input.pop_back().unwrap());
  31. res.push_back(input.pop_back().unwrap());
  32. while input.len()>1 {
  33. // 每次执行两步 放一个挪一个
  34. let mut temp = input.pop_back().unwrap();
  35. res.push_front(temp);
  36. temp = res.pop_back().unwrap();
  37. res.push_front(temp);
  38. }
  39. res.push_front(input.pop_back().unwrap());
  40. res
  41. }