以下是网易有道2017年内推编程题第一题题目及本人的解题过程,在这里和大家做个分享。
1、 题目
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiN0IDMzADN2EjNxkDM2EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
2、 输入输出
3、 我的解题思路
首先将牌堆存放在大小为2n的数组中,然后将牌堆分成两个大小为n的上下两个牌堆,最后将上下两个牌堆交替放下组成新的大小为2n的牌堆。
4、 我的实现
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
for(int m=; m<t; m++)
{
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] pai = new int[*n];
//输入
for(int i=; i<*n; i++)
{
pai[i] = scanner.nextInt();
}
//进行k次洗牌
for(int j=; j<k; j++)
{
xipai(pai, n);
}
//输出
int p=;
for(; p<*n-; p++)
{
System.out.print(pai[p] + " ");
}
System.out.println(pai[p]);
}
}
//洗牌
public static void xipai(int[] pai, int n)
{
int[] pai1 = new int[n];
int[] pai2 = new int[n];
int index = ;
//左手牌堆
for(int i=; i<n; i++)
{
pai1[i] = pai[i];
}
//右手牌堆
for(int j=; j<n; j++)
{
pai2[j] = pai[j+n];
}
//洗牌
for(int p=; p<n; p++)
{
pai[index++] = pai1[p];
pai[index++] = pai2[p];
}
}
}
5、 改进
后来在题目解析中看到了一种更好地解决方法,贴在这里供大家参考。
这一解法需要注意一下其中的规律:
–如果当前数小于等于n(即在左手),则他下次出现的位置是 2*当前位置-1
–如果当前位置大于n(即在右手),则他下次出现的位置是 2*(当前位置 - n)
import java.util.Scanner;
public class Xipai
{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int groups = sc.nextInt();
while (groups-- > ){
int n = sc.nextInt();
int k = sc.nextInt();
int[] res = new int[*n];
for(int i=;i<*n;i++){
int tmp = i + ;
for(int j = ; j < k;j++){
if (tmp <= n) tmp = *tmp - ;
else tmp = * (tmp - n);
}
res[tmp - ]=sc.nextInt();
}
//输出
if(res.length> ) System.out.print(res[]);
for(int i = ;i< *n;i++){
System.out.print(" "+res[i]);
}
System.out.println();
}
}
}
6、 总结
感谢以上提供改进算法的大神。当然,如果哪位大神有更好的解法,也希望不吝赐教,不胜感激!