一个简单的洗牌问题,JAVA实现

这题是招商提前批笔试的一道题,当时做的不好,没有练习scanner,现在总结一下。
洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。
题目记不清了,就例如:1,2,3,4,5,6的牌,分俩组,1,2,3和4,5,6,合成1,4,2,5,3,6,(不清楚奇数张牌怎么处理)。

下面这个代码是先放1,再放4,这样交叉放,奇数多的一张顺延放在最后。比如1,2,3,4,5,6,7就会变成1,4,2,5,3,6,7.
输入:
6 1 1 2 3 4 5 6
输出:
1 4 2 5 3 6
输入第一个数是牌的长度,输入第二个数是洗牌次数。

    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int nums;//牌的个数
        int[] num;//牌面
        int turns;
        if (scanner.hasNextInt()) {
             nums = scanner.nextInt();
             num = new int[nums];
            if (scanner.hasNextInt()) {
                turns = scanner.nextInt();
                if (nums>0) {
                    for (int i = 0; i < nums; i++) {
                        if (scanner.hasNextInt()){
                            num[i]=scanner.nextInt();
                        }
                    }
                }
                while (turns>0){
                    int[] arr = new int[nums];
                    for (int i = 0; i < nums; i++) {
                        int temp = i ;
                        if (temp<nums/2){
                            temp = 2*temp;
                        }else {
                            if (temp == nums-1){

                            }else {
                                temp = 2*(temp-nums/2)+1;
                            }
                        }
                        arr[temp] = num[i];
                    }
                    num = Arrays.copyOf(arr,arr.length);
                    turns--;
                }
            }
            System.out.println(Arrays.toString(num));
        }

        scanner.close();
    }

看到了这个描述:

洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张。首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆)。接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌。接着把牌合并起来就可以了。 例如有6张牌,最开始牌的序列是1,2,3,4,5,6。首先分成两组,左手拿着1,2,3;右手拿着4,5,6。在洗牌过程中按顺序放下了6,3,5,2,4,1。把这六张牌再次合成一组牌之后,我们按照从上往下的顺序看这组牌,就变成了序列1,4,2,5,3,6。 现在给出一个原始牌组,请输出这副牌洗牌k次之后从上往下的序列。
————————————————
版权声明:本文为CSDN博主「zhao_miao」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zhao_miao/article/details/88710905

关键点:例如有6张牌,最开始牌的序列是1,2,3,4,5,6。首先分成两组,左手拿着1,2,3;右手拿着4,5,6。在洗牌过程中按顺序放下了6,3,5,2,4,1。把这六张牌再次合成一组牌之后,我们按照从上往下的顺序看这组牌,就变成了序列1,4,2,5,3,6。
如果这么说:对1,2,3,4,5,6,7;就会有4,1,5,2,6,3,7;
感觉这个描述好;
模拟这个过程一下:

    public static void xipai2(){
        Scanner scanner = new Scanner(System.in);
        int nums;//牌的个数
        int[] num;//牌面
        int turns;//洗牌次数
        if (scanner.hasNextInt()) {
            nums = scanner.nextInt();
            num = new int[nums];
            if (scanner.hasNextInt()) {
                turns = scanner.nextInt();
                if (nums>0) {
                    for (int i = 0; i < nums; i++) {
                        if (scanner.hasNextInt()){
                            num[i]=scanner.nextInt();
                        }
                    }
                }
                while (turns>0){
                    int[] arr = new int[nums];
                    int a = nums/2-1;
                    int b = nums-1;
                    int c = nums-1;
                    while (b>=nums/2){
//                        arr[c] = num[b];
//                        if (a>=0) arr[--c] = num[a];//奇数张牌时,a先不满足条件,此时b还有一个数;注意c--和--c的区别;
//                        a--;b--;c--;
                        arr[c--] = num[b--];
                        if (a>=0) arr[c--] = num[a--];//奇数张牌时,a先不满足条件,此时b还有一个数;
                    }
                    num = Arrays.copyOf(arr,arr.length);
                    turns--;
                }
            }
            System.out.println(Arrays.toString(num));
        }

        scanner.close();
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是Java实现洗牌游戏: ```java import java.util.ArrayList; import java.util.Collections; import java.util.List; public class ShuffleGame { public static void main(String[] args) { // 创建一副扑克牌 List<String> deck = new ArrayList<>(); String[] suits = {"♠️", "♥️", "♣️", "♦️"}; String[] ranks = {"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"}; for (String suit : suits) { for (String rank : ranks) { deck.add(rank + suit); } } System.out.println("洗牌前的牌组:" + deck); // 洗牌 Collections.shuffle(deck); System.out.println("洗牌后的牌组:" + deck); } } ``` 在这个程序中,我们使用了Java的集合框架中的List来存储一副扑克牌。首先,我们创建一个包含所有扑克牌的List对象,并输出它的内容。然后,我们使用Collections.shuffle()方法对这个List对象进行洗牌操作,并再次输出洗牌后的结果。 运行这个程序,你会看到类似下面的输出结果: ``` 洗牌前的牌组:[A♠️, 2♠️, 3♠️, 4♠️, 5♠️, 6♠️, 7♠️, 8♠️, 9♠️, 10♠️, J♠️, Q♠️, K♠️, A♥️, 2♥️, 3♥️, 4♥️, 5♥️, 6♥️, 7♥️, 8♥️, 9♥️, 10♥️, J♥️, Q♥️, K♥️, A♣️, 2♣️, 3♣️, 4♣️, 5♣️, 6♣️, 7♣️, 8♣️, 9♣️, 10♣️, J♣️, Q♣️, K♣️, A♦️, 2♦️, 3♦️, 4♦️, 5♦️, 6♦️, 7♦️, 8♦️, 9♦️, 10♦️, J♦️, Q♦️, K♦️] 洗牌后的牌组:[9♠️, Q♠️, 8♦️, 4♦️, 7♠️, 5♣️, 10♦️, A♠️, 3♣️, J♦️, 6♦️, 8♣️, K♣️, 4♣️, 7♥️, 9♥️, 2♥️, 6♠️, 2♣️, A♦️, K♦️, 10♠️, 9♣️, 5♠️, A♥️, Q♥️, 2♦️, 3♥️, J♠️, 8♥️, 7♣️, 5♥️, 6♥️, 4♠️, 3♠️, K♠️, J♥️, Q♣️, 10♣️, A♣️, 3♦️, 8♠️, K♥️, 4♥️, 7♦️, 2♠️, J♣️, 10♥️, 6♣️, 5♦️, 9♦️] ``` 这个程序并不是一个完整的洗牌游戏,只是简单地演示了如何使用Java的集合框架来实现洗牌操作。如果你想要实现一个完整的洗牌游戏,需要考虑更多的细节问题,比如如何发牌、如何判断胜负等等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值