網易有道2017內推程式設計題第一題
阿新 • • 發佈:2019-02-16
以下是網易有道2017年內推程式設計題第一題題目及本人的解題過程,在這裡和大家做個分享。
1、 題目
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=0; m<t; m++)
{
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] pai = new int[2*n];
//輸入
for(int i=0; i<2*n; i++)
{
pai[i] = scanner.nextInt();
}
//進行k次洗牌
for(int j=0; j<k; j++)
{
xipai(pai, n);
}
//輸出
int p=0;
for(; p<2*n-1; 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 = 0;
//左手牌堆
for(int i=0; i<n; i++)
{
pai1[i] = pai[i];
}
//右手牌堆
for(int j=0; j<n; j++)
{
pai2[j] = pai[j+n];
}
//洗牌
for(int p=0; 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-- > 0){
int n = sc.nextInt();
int k = sc.nextInt();
int[] res = new int[2*n];
for(int i=0;i<2*n;i++){
int tmp = i + 1;
for(int j = 0; j < k;j++){
if (tmp <= n) tmp = 2*tmp - 1;
else tmp = 2 * (tmp - n);
}
res[tmp - 1]=sc.nextInt();
}
//輸出
if(res.length> 0) System.out.print(res[0]);
for(int i = 1;i< 2*n;i++){
System.out.print(" "+res[i]);
}
System.out.println();
}
}
}
6、 總結
感謝以上提供改進演算法的大神。當然,如果哪位大神有更好的解法,也希望不吝賜教,不勝感激!