逆推手牌

扑克牌发一张并把当前的放到堆底,通过牌桌上牌出现的顺序逆推手牌原始顺序。从最后发的牌N-1开始,倒退的上一步是N-1被放置堆底,手牌里还是只有N-1;再上一步是发N-2,倒退这步就是把N-2放到N-1前面;再上一步是置堆底,逆推回原状态也就是把N-1放到N-2前,依此类推每次是插入到首元素,然后把尾元素置顶。如此直到第一个元素0,它没有经历过置底过程,直接break。

#include <iostream>
#include <deque>
#include <vector>
using namespace std;
class Solution {
public:
    vector<int> rollback(vector<int> &nums) {
        deque<int> res;
        for (int i = nums.size() - 1; i >= 0; --i) {
            res.push_front(nums[i]);
            if (i == 0) break;
            const auto b = res.back();
            res.pop_back();
            res.push_front(b);
        }
        return vector<int>(res.begin(), res.end());
    }

};

int main() {
    vector<int> nums = {1, 3, 5, 4, 2};
    Solution sol;
    for (const auto i : sol.rollback(nums)) cout << i << ", ";
}

Last updated