java实现洗牌

洗牌问题,有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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值