zoukankan      html  css  js  c++  java
  • 洗牌

    网易有道内推编程题:

    洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。 现在需要洗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次之后从上往下的序列。
     
     

    输入描述:

    第一行一个数T(T ≤ 100),表示数据组数。对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来一行有2n个数a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌组从上到下的序列。

    输出描述:

    对于每组数据,输出一行,最终的序列。数字之间用空格隔开,不要在行末输出多余的空格。


    解析:每次洗牌后,从上往下看,其实是将原数组分成前后两部分,然后将后一个数组插入到前一个数组中。比如,1,2,3,;4,5,6,将4插入到1,2之间,5插入到2,3之间,6插入到3后面。
    根据这种规则,新数组为 1,4,2,5,3,6 。新数组中下标为偶数的,就是原数组前半部分,下标为奇数的就是原数组后半部分.所以,这样洗牌一次后的结果(从上往下看),
    就是下面代码中xiPai方法所示,而洗牌k此,每次洗牌规则都是这样的。
     
    import java.util.Arrays;
    import java.util.Scanner;
    /*
     * 第一行一个数T(T ≤ 100),表示数据组数。
     * 对于每组数据,第一行两个数n,k(1 ≤ n,k ≤ 100),接下来一行有2n个数a1,a2,...,a2n(1 ≤ ai ≤ 1000000000)。表示原始牌组从上到下的序列。
     */
    
    public class Main {
        public static void main(String[] args){
            Scanner sc=new Scanner(System.in);
            int T=sc.nextInt();
            while(T>0){
                int n=sc.nextInt();
                int k=sc.nextInt();
                int[] a=new int[2*n];
                for(int i=0;i<2*n;i++)
                    a[i]=sc.nextInt();
                for(int i=0;i<k;i++){
                    a=xiPai(a);
                }
                for(int i=0;i<a.length-1;i++){
                    System.out.print(a[i]+" ");
                }
                System.out.println(a[2*n-1]);
                T--;
            }
            
        }
    
        private static int[] xiPai(int[] a) {
            int[] b=new int[a.length];
            
            for(int i=0;i<a.length/2;i++){
                b[2*i]=a[i];
                b[2*i+1]=a[i+a.length/2];
            }
            
            return b;
        }    
                
    }
    
    
    做对一题不容易。。




  • 相关阅读:
    PAT Basic 1077 互评成绩计算 (20 分)
    PAT Basic 1055 集体照 (25 分)
    PAT Basic 1059 C语言竞赛 (20 分)
    PAT Basic 1072 开学寄语 (20 分)
    PAT Basic 1049 数列的片段和 (20 分)
    蓝桥杯BASIC-13 数列排序
    蓝桥杯入门——3.序列求和
    蓝桥杯入门——2.圆的面积
    蓝桥杯入门——1.Fibonacci数列
    树的总结(遍历,BST,AVL原型,堆,练习题)
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8039792.html
Copyright © 2011-2022 走看看