1. 程式人生 > >網易遊戲2018年筆試題

網易遊戲2018年筆試題

第一題:[程式設計題] 時鐘

題目描述

小W有一個電子時鐘用於顯示時間,顯示的格式為HH:MM:SS,HH,MM,SS分別表示時,分,秒。其中時的範圍為[‘00’,‘01’…‘23’],分的範圍為[‘00’,‘01’…‘59’],秒的範圍為[‘00’,‘01’…‘59’]。

img

但是有一天小W發現鐘錶似乎壞了,顯示了一個不可能存在的時間“98:23:00”,小W希望改變最少的數字,使得電子時鐘顯示的時間為一個真實存在的時間,譬如“98:23:00”通過修改第一個’9’為’1’,即可成為一個真實存在的時間“18:23:00”。修改的方法可能有很多,小W想知道,在滿足改變最少的數字的前提下,符合條件的字典序最小的時間是多少。其中字典序比較為用“HHMMSS”的6位字串進行比較。

輸入描述:

每個輸入資料包含多個測試點。每個測試點後有一個空行。 第一行為測試點的個數T(T<=100)。 每個測試點包含1行,為一個字串”HH:MM:SS”,表示鐘錶顯示的時間。

輸出描述:

對於每個測試點,輸出一行。如果鐘錶顯示的時間為真實存在的時間,則不做改動輸出該時間,否則輸出一個新的”HH:MM:SS”,表示修改最少的數字情況下,字典序最小的真實存在的時間。

輸入例子1:

2
19:90:23
23:59:59

輸出例子1:

19:00:23
23:59:59

程式碼實現

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import
java.io.FileReader; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * @author Created By Frank * @date 2018-08-07 15:12 */ public class Main1 { public static void main(String[] args) throws FileNotFoundException { Scanner in = new Scanner(System.in); int
n = Integer.valueOf(in.nextLine()); for(int i = 0;i<n;i++){ String strTime = in.nextLine(); if (!isValid(strTime)) { System.out.println(changeTime(strTime)); } else { System.out.println(strTime); } } } // 判斷是否有效 public static boolean isValid(String time) { int hours = Integer.valueOf(time.split(":")[0]); int mins = Integer.valueOf(time.split(":")[1]); int seconds = Integer.valueOf(time.split(":")[2]); if (hours >= 0 && hours <= 23 && mins >= 0 && mins <= 59 && seconds >= 0 && seconds <= 59) return true; return false; } public static String changeTime(String time) { StringBuffer res = new StringBuffer(); String h = time.split(":")[0]; String m = time.split(":")[1]; String s = time.split(":")[2]; int hours = Integer.valueOf(time.split(":")[0]); int mins = Integer.valueOf(time.split(":")[1]); int seconds = Integer.valueOf(time.split(":")[2]); List<String> list = new ArrayList<>(); if (hours >= 0 && hours <= 23) { res.append(h); } else { res.append("0"); res.append(hours % 10); } res.append(":"); if (mins >= 0 && mins <= 59) { res.append(m); } else { res.append("0"); res.append(mins % 10); } res.append(":"); if (seconds >= 0 && seconds <= 59) { res.append(s); } else { res.append("0"); res.append(seconds % 10); } return res.toString(); } }

第二題:[程式設計題] 會話列表

題目描述

小云正在參與開發一個即時聊天工具,他負責其中的會話列表部分。

會話列表為顯示為一個從上到下的多行控制元件,其中每一行表示一個會話,每一個會話都可以以一個唯一正整數id表示。

當用戶在一個會話中傳送或接收資訊時,如果該會話已經在會話列表中,則會從原來的位置移到列表的最上方;如果沒有在會話列表中,則在會話列表最上方插入該會話。

小云在現在要做的工作是測試,他會先把會話列表清空等待接收資訊。當接收完大量來自不同會話的資訊後,就輸出當前的會話列表,以檢查其中是否有bug。

輸入描述:

輸入的第一行為一個正整數T(T<=10),表示測試資料組數。
接下來有T組資料。每組資料的第一行為一個正整數N(1<=N<=200),表示接收到資訊的次數。第二行為N個正整數,按時間從先到後的順序表示接收到資訊的會話id。會話id不大於1000000000。

輸出描述:

對於每一組資料,輸出一行,按會話列表從上到下的順序,輸出會話id。
相鄰的會話id以一個空格分隔,行末沒有空格。

輸入例子1:

3
5
1 2 3 4 5
6
1 100 1000 1000 100 1
7
1 6 3 3 1 8 1

輸出例子1:

5 4 3 2 1
1 100 1000
1 8 3 6

程式碼實現

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.LinkedHashSet;
import java.util.Scanner;
import java.util.Set;

/**
 * @author Created By Frank
 * @date 2018-08-07 15:13
 */
public class Main2 {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        for (int k = 0; k < n; k++) {
            int count = in.nextInt();
            Set<Integer> set = new LinkedHashSet<>();

            for (int i = 0; i < count; i++) {
                int item = in.nextInt();
                if (set.contains(item)) {
                    set.remove(item);
                }
                set.add(item);
            }
            printReverseSet(set);
            if (k != n - 1) {
                System.out.println();
            }

        }
    }

    private static void printReverseSet(Set<Integer> set) {
        for (int i = set.size() - 1; i >= 0; i--) {
            System.out.print(set.toArray()[i]);
            if (i != 0) {
                System.out.print(" ");
            }
        }
    }
}

第三題:[程式設計題] 字元迷陣

題目描述

字元迷陣是一種經典的智力遊戲。玩家需要在給定的矩形的字元迷陣中尋找特定的單詞。

在這題的規則中,單詞是如下規定的:

  1. 在字元迷陣中選取一個字元作為單詞的開頭;
  2. 選取右方、下方、或右下45度方向作為單詞的延伸方向;
  3. 以開頭的字元,以選定的延伸方向,把連續得到的若干字元拼接在一起,則稱為一個單詞。

img

以圖1為例,如果要在其中尋找單詞”WORD”,則綠色框所標示的都是合法的方案,而紅色框所標示的都是不合法的方案。

現在的問題是,給出一個字元迷陣,及一個要尋找的單詞,問能在字元迷陣中找到多少個該單詞的合法方案。注意合法方案是可以重疊的,如圖1所示的字元迷陣,其中單詞”WORD”的合法方案有4種。

輸入描述:

輸入的第一行為一個正整數T,表示測試資料組數。 接下來有T組資料。每組資料的第一行包括兩個整數m和n,表示字元迷陣的行數和列數。接下來有m行,每一行為一個長度為n的字串,按順序表示每一行之中的字元。再接下來還有一行包括一個字串,表示要尋找的單詞。 資料範圍: 對於所有資料,都滿足1<=T<=9,且輸入的所有位於字元迷陣和單詞中的字元都為大寫字母。要尋找的單詞最短為2個字元,最長為9個字元。字元迷陣和行列數,最小為1,最多為99。 對於其中50%的資料檔案,字元迷陣的行列數更限制為最多為20。

輸出描述

對於每一組資料,輸出一行,包含一個整數,為在給定的字元迷陣中找到給定的單詞的合法方案數。

輸入例子1:

3
10 10
AAAAAADROW
WORDBBBBBB
OCCCWCCCCC
RFFFFOFFFF
DHHHHHRHHH
ZWZVVVVDID
ZOZVXXDKIR
ZRZVXRXKIO
ZDZVOXXKIW
ZZZWXXXKIK
WORD
3 3
AAA
AAA
AAA
AA
5 8
WORDSWOR
ORDSWORD
RDSWORDS
DSWORDSW
SWORDSWO
SWORD

輸出例子1:

4
16
5

程式碼實現

import java.io.FileNotFoundException;
import java.util.Scanner;

/**
 * @author Created By Frank
 * @date 2018-08-08 8:34
 */
public class Main3 {
    public static void main(String[] args) throws FileNotFoundException {
        Scanner in = new Scanner(System.in);
        int t = in.nextInt();
        in.nextLine();

        for (int s = 0; s < t; s++) {

            int res = 0;
            int m = in.nextInt();
            int n = in.nextInt();
            char[][] board = new char[m][n];
            in.nextLine();

            for (int i = 0; i < m; i++) {
                String linestr = in.nextLine();
                char[] arr = linestr.toCharArray();
                for (int j = 0; j < n; j++) {
                    board[i][j] = arr[j];
                }
            }
            String word = in.nextLine();


            for (int i = 0; i < m; i++) {
                for (int j = 0; j < n; j++) {
                    if (scanRight(board, i, j, word))
                        res++;
                    if (scanDown(board, i, j, word))
                        res++;
                    if (scanRD(board, i, j, word))
                        res++;
                }
            }
            System.out.println(res);
        }
    }

    private static boolean scanRD(char[][] board, int x, int y, String word) {
        int len = word.length();
        if (!inArea(x + len - 1, y + len - 1, board)) {
            return false;
        }
        StringBuffer sbf = new StringBuffer();
        for (int xs = x, ys = y; xs < x + len; xs++, ys++) {
            sbf.append(board[xs][ys]);
        }
        return word.equals(sbf.toString());
    }

    private static boolean scanDown(char[][] board, int x, int y, String word) {
        int len = word.length();
        if (!inArea(x + len - 1, y, board)) {
            return false;
        }
        StringBuffer sbf = new StringBuffer();
        for (int index = x; index < x + len; index++) {
            sbf.append(board[index][y]);
        }
        return word.equals(sbf.toString());
    }


    private static boolean scanRight(char[][] board, int x, int y, String word) {
        int len = word.length();
        if (!inArea(x, y + len - 1, board)) {
            return false;
        }

        StringBuffer sbf = new StringBuffer();
        for (int index = y; index < y + len; index++) {
            sbf.append(board[x][index]);
        }
        return word.equals(sbf.toString());
    }

    private static boolean inArea(int x, int y, char[][] board) {
        int m = board.length;
        int n = board[0].length;
        return x >= 0 && x < m && y >= 0 && y < n;
    }
}