网易有道洗牌笔试题代码经验分享

昨天(2016.08.17)参加了有道的提前批在线笔试,遇到了个洗牌的编程题,题目的意思是有2n张牌,分成两半,将后一半的最后一张拿出来放在最底下,再把前一半的最后一张拿出来放在上面,如此反复,直到所有的牌放在一起的时候,再将整副牌翻过来。从上到下读出牌的数字即可。
输入形式:t(有多少组数据)
n k
任意2n个数字,用空格分开
输出形式:洗牌之后的2n个数字,用空格隔开
实例:
网易有道洗牌笔试题代码经验分享_第1张图片
代码片段:

package cn.snnu.estudy.wechat.check;

import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        Main m = new Main();
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        int n;
        int k = 0;
        sc.nextLine();
        for (int i = 1; i <= t; i++) {
            n = sc.nextInt();
            k = sc.nextInt();
            sc.nextLine();
            ArrayList resultList = new ArrayList();
            for (int j = 0; j < 2 * n; j++) {
                resultList.add(sc.nextInt());
            }

            for (int l = 0; l < k; l++) {
                resultList = maintest(resultList);
            }
            for (int p = 0; p < resultList.size(); p++) {
                System.out.print(resultList.get(p) + " ");

            }
            sc.nextLine();

        }

    }

    private static ArrayList maintest(ArrayList list) {
        // TODO Auto-generated method stub
        Stack s = new Stack();

        int start = (list.size()) / 2 - 1;
        int end = list.size() - 1;

        while (start >= 0 && end >= list.size() / 2) {

            s.push(list.get(end));
            s.push(list.get(start));
            end--;
            start--;
        }
        list.clear();
        while (!s.isEmpty()) {
            list.add(s.pop());
        }

        return list;

    }

}
运行结果即为上图展示结果。这里用到了栈和动态数组两种数据存储结构,maintest方法为洗牌过程。洗牌过程中用了栈的存储结构,意在洗牌最后的翻转,即为出栈,洗牌之后的结果保存在动态数组resultList里面,最后打印出数组内容即可。

你可能感兴趣的:(网易有道洗牌笔试题代码经验分享)