洗牌问题,有2N张牌,平均分为两堆A与B,然后放一张A,再放一张B,直到A堆与B堆全部放完,形成C堆,算洗完一次牌。
例:有一堆牌1,2,3,4,5,6,平均分为两堆A:1,2,3和B:4,5,6,洗完牌后形成C:6,3,5,2,4,1
需要实现洗m次牌后的牌序。
public class Shuffle { private ArrayList<Integer> mPoker = new ArrayList<>(); private ArrayList<Integer> mResult = new ArrayList<>(); private int mShuffleCount = 0; /** * 洗牌方法,初始化洗牌次数,和2n张牌 * @param shuffleCount * @param poker */ public void shuffle(int shuffleCount, ArrayList<Integer> poker) { if (shuffleCount <= 0) { // 洗牌次数错误 return; } if (poker == null || poker.size() % 2 == 1) { // 没有牌可洗,或者扑克数位单数 return; } mShuffleCount = shuffleCount; mPoker = poker; shuffle(); } /** * 在洗牌次数没有到达指定次数时一直洗牌 */ private void shuffle() { int count = 0; while (count <= mShuffleCount) { shuffle(mPoker); count ++ ; } } /** * 洗一次牌后的结果, 洗牌前为poker,洗牌后为result * @param poker */ private List<Integer> shuffle(ArrayList<Integer> poker) { int heapCount = poker.size() / 2; int count = 0; ArrayList<Integer> result = new ArrayList<>(); while (count <= heapCount - 1) { Integer heapElement1 = poker.get(count); Integer heapElement2 = poker.get(heapCount - 1 + count); result.add(heapElement1); result.add(heapElement2); count ++ ; } return result; } }