天天看点

网易有道2017内推编程题第一题

以下是网易有道2017年内推编程题第一题题目及本人的解题过程,在这里和大家做个分享。

1、 题目

网易有道2017内推编程题第一题

2、 输入输出

网易有道2017内推编程题第一题

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、 总结

感谢以上提供改进算法的大神。当然,如果哪位大神有更好的解法,也希望不吝赐教,不胜感激!

继续阅读