今天面试碰到两个嘎嘎难的题,哪位资深程序员给解答一下

一副牌,不明顺序,我们第一张放到最下边,第二张展示,第三张放到最下边,第四张展示,如此往复,最后展示的是1-13顺序排列,请问原先的顺序是什么。
(๑• . •๑)

这不就是54个人排队报数,挨个枪毙偶数,最后一个是几号活着的变种吗,就是约瑟夫环,单向循环链表,N=54,M=2

第一波能确定这些 :?、1、?、2、?、3、?、4、?、5、?、6、?
第二波 : 7、1、?、2、8、3、?、4、9、5、?、6、10
第三波:7、1、11、2、8、3、?、4、9、5、13、6、10
第四波:7、1、11、2、8、3、13、4、9、5、13、6、10


import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= 13; i++) {
            list.add(i);
        }
        //[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]
        System.out.println(list);
        List<Integer> list1 = swap(list);
        //[7, 1, 12, 2, 8, 3, 11, 4, 9, 5, 13, 6, 10]
        System.out.println(list1);
    }

    /**
     * 最直接的方法,反推,把原来的操作逆过来走。
     *
     * @param a
     * @return
     */
    public static List<Integer> swap(List<Integer> a) {
        //b就是要求解的数据
        List<Integer> b = new ArrayList<>();
        //a要从后往前走
        for (int i = a.size() - 1; i >= 0; i--) {
            //把a的最后一位放到b的第一位(对应“展示”的相反操作)
            b.add(0, a.get(i));
            //再将b中最后一个移到第一位(对应“放到最下边”的相反操作)
            b.add(0, b.get(b.size() - 1));
            b.remove(b.size() - 1);
        }
        return b;
    }
}