【遇见时光】网易有道2017内推编程-洗牌

洗牌

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)

Problem Description:

洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程。

现在需要洗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)。表示原始牌组从上到下的序列。

输出

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

样例输入

3

3 1

1 2 3 4 5 6

3 2

1 2 3 4 5 6

2 2

1 1 1 1

样例输出

1 4 2 5 3 6

1 5 4 3 2 6

1 1 1 1

我的思路,用两个数组把原数组前一半和后一半分别保存下来;然后再按照规律给原数组赋值

 1 package test;
 2
 3 import java.util.Scanner;
 4
 5 public class PokerFace {
 6
 7     //一次洗牌
 8     public static int[] replace(int a[], int n) {
 9         // int m = a.length;
10         int b[] = new int[n];
11         int c[] = new int[n];
12         // 将数组a的前一半赋值给c
13         for (int i = 0; i < n; i++) {
14             c[i] = a[i];
15         }
16         // 将数组a的后一半赋值给b
17         for (int i = 0; i < n; i++) {
18             b[i] = a[i + n];
19         }
20         //数组c的0,1,2,3,4...对应数组a的0,2,4,6,8...,所以a的下标是c的2倍
21         for (int j = 0; j < n; j++) {
22             a[j * 2] = c[j];
23         }
24         //数组b的0,1,2,3,4...对应数组a的1,3,5,7,9...,所以a的下标是c的2倍加1
25         for (int p = 0; p < n; p++) {
26             int m = p * 2 + 1;
27             a[p * 2 + 1] = b[p];
28         }
29         return a;
30     }
31
32     //打印结果
33     public static void print(int a[]) {
34         for (int i = 0; i < a.length; i++) {
35             System.out.print(a[i] + " ");
36         }
37     }
38
39     public static void main(String args[]) {
40         Scanner cin = new Scanner(System.in);
41         int a, b;
42
43         //获取测试数据的组数
44         int t = cin.nextInt();
45
46         while (t > 0 && cin.hasNextInt()) {
47             a = cin.nextInt();//当前测试数据的个数
48             b = cin.nextInt();//洗牌次数
49             //数组c保存数据
50             int c[] = new int[a * 2];
51             //讲输入数据存入数组c
52             for (int i = 0; i < a * 2 && cin.hasNextInt(); i++) {
53                 c[i] = cin.nextInt();
54             }
55             while (b > 0) {
56                 c = replace(c, a);
57                 b--;
58             }
59             print(c);
60             t--;
61         }
62
63     }
64 }

输出:

3
3 1
1 2 3 4 5 6
1 4 2 5 3 6
3 2
1 2 3 4 5 6
1 5 4 3 2 6
2 2
1 1 1 1
1 1 1 1 
时间: 2024-10-16 06:30:57

【遇见时光】网易有道2017内推编程-洗牌的相关文章

网易有道2017内推编程题

没有报有道,在牛客上做的... 1.洗牌 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿 着第n+1张到第2n张(下半堆).接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的 倒数第二张牌,直到最后放下左手的第一张牌.接着把牌合并起来就可以了. 例如有6张牌,最开始牌的序列是1,2,

2017 网易有道研发内推笔试编程题 8.17

15个选择题,每个2分,3个程序题,每个30.

两种排序方法 网易2017内推编程题

考拉有n个字符串字符串,任意两个字符串长度都是不同的.考拉最近学习到有两种字符串的排序方法: 1.根据字符串的字典序排序.例如: "car" < "carriage" < "cats" < "doggies < "koala" 2.根据字符串的长度排序.例如: "car" < "cats" < "koala" < &

链家秋招内推编程笔试题目

参加8.19的链家内推笔试,总体来说题目难度不大,20个选择题还有三道编程题. 选择题,里面有两道关于IP地址计算的题目,有点忘了,不知道最后的计算有没有问题,所以还需要复习学习完的知识, 因为不知道什么时候就会遇到相关的问题. 编程题,自我感觉,难度是偏简单的,如果不能达到两道AC,那就是不合格了. 1. 给定的一个1,2,3组成的数字序列,排成升序所需的最少交换次数 . 样例输入: 9 2 2 1 3 3 3 2 3 1 样例输出: 4 思路: 应使用贪心算法. 分析:先存入数组,然后记录有

网易有道内推编程题

[编程题] 洗牌 洗牌在生活中十分常见,现在需要写一个程序模拟洗牌的过程. 现在需要洗2n张牌,从上到下依次是第1张,第2张,第3张一直到第2n张.首先,我们把这2n张牌分成两堆,左手拿着第1张到第n张(上半堆),右手拿着第n+1张到第2n张(下半堆).接着就开始洗牌的过程,先放下右手的最后一张牌,再放下左手的最后一张牌,接着放下右手的倒数第二张牌,再放下左手的倒数第二张牌,直到最后放下左手的第一张牌.接着把牌合并起来就可以了. 例如有6张牌,最开始牌的序列是1,2,3,4,5,6.首先分成两组

网易2017内推--2、构造队列

题目描述: 小明同学把1到n这n个数字按照一定的顺序放入了一个队列Q中.现在他对队列Q执行了如下程序: while(!Q.empty())              //队列不空,执行循环 {     int x=Q.front();            //取出当前队头的值x     Q.pop();                 //弹出当前队头     Q.push(x);               //把x放入队尾     x = Q.front();              /

网易2017内推笔试题 合唱团

题目链接:https://www.nowcoder.com/questionTerminal/661c49118ca241909add3a11c96408c8 题目大意: 略 分析: TODO 代码如下: 原文地址:https://www.cnblogs.com/zaq19970105/p/10793259.html

网易内推(C++/C研发)offer之路 精

作者:张佃鹏链接:https://www.nowcoder.com/discuss/3038来源:牛客网 网易内推(C++/C研发)offer之路 精 张佃鹏 编辑于 2016-03-01 09:22:41 回复59 | 已赞 129 | 浏览49340 网易内推(C++/C研发)offer之路 精 看到大家都在牛客上写面经,我也来凑一下热闹,本人是一所普通高校的研究生(非211,985高校),自动化专业(非计算机). 上个星期拿到了网易内推C++研发岗位的offer,在这里要感谢师姐给予的内推

腾讯内推一面C++

北邮论坛找个腾讯的内推,没想到那么快就安排面试了.第一次面腾讯,写点东西记录一下吧. 面的是位置服务部门. 去了之后HR先给了两张纸,有三道编程题.第一道是求 二进制中1的个数(考察位运算)(剑指offer上的一道原题),很简单的思路.第二题是让自己实现一个String类,要能够实现赋值.拷贝赋值.字符串连接.判断字符串相等.其实就是相当于自己写一个类,然后需要注意运算符重载的问题.自己 在实现的时候还是会有一些漏洞.第三题是实现一个卷积的计算,不过还没开始写,面试官就过来找我了,开始了面试.