扑克牌:字节
假设有一堆扑克牌,做两个操作,首先从牌顶拿一张到桌子上,然后牌顶拿一张到牌底
一直重复直至没排,给定桌子上的牌,问原本的一堆牌是什么。
这一题是纯粹的逆向思维的题,但是我没做好:
过程如下:
考虑原本的是 1,2,3,4,5,6,7那么过程就是:{{注意思考方式:[out]: remain}[1] 2 3 4 5 6 7[3] 4 5 6 7 2[5] 6 7 2 4[7] 2 4 6[4] 6 2[2] 6}我之前想破脑袋也没想完全这个逆向的过程,其实画了这个图之后就可以看出来首先就是,使用一个双端队列将最后的两位正确的保存然后桌面上左端出一个结果就是前面加一个,然后挪动一个,核心的翻转的思想就是,构建每一次的remain即:初始构建 6 2来 4 4 6 2 -> 2 4 6来 7 7 2 4 6 -> 6 7 2 4...代码:fn main() {let mut test = VecDeque::from([1, 3, 5, 7, 4, 2, 6]);let deque = original(&mut test);println!("{:?}", deque);}fn original(input: &mut VecDeque<i32>) -> VecDeque<i32> {if input.len() <= 2 { return input.clone() }let mut res = VecDeque::with_capacity(input.len());res.push_back(input.pop_back().unwrap());res.push_back(input.pop_back().unwrap());while input.len()>1 {// 每次执行两步 放一个挪一个let mut temp = input.pop_back().unwrap();res.push_front(temp);temp = res.pop_back().unwrap();res.push_front(temp);}res.push_front(input.pop_back().unwrap());res}
