1. 程式人生 > >網易有道2017內推程式設計題第一題

網易有道2017內推程式設計題第一題

以下是網易有道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、 總結
感謝以上提供改進演算法的大神。當然,如果哪位大神有更好的解法,也希望不吝賜教,不勝感激!