网易有道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、 总结
感谢以上提供改进算法的大神。当然,如果哪位大神有更好的解法,也希望不吝赐教,不胜感激!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值