一副牌,不明顺序,我们第一张放到最下边,第二张展示,第三张放到最下边,第四张展示,如此往复,最后展示的是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;
}
}