網易遊戲2018年筆試題
第一題:[程式設計題] 時鐘
題目描述
小W有一個電子時鐘用於顯示時間,顯示的格式為HH:MM:SS,HH,MM,SS分別表示時,分,秒。其中時的範圍為[‘00’,‘01’…‘23’],分的範圍為[‘00’,‘01’…‘59’],秒的範圍為[‘00’,‘01’…‘59’]。
但是有一天小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(" ");
}
}
}
}
第三題:[程式設計題] 字元迷陣
題目描述
字元迷陣是一種經典的智力遊戲。玩家需要在給定的矩形的字元迷陣中尋找特定的單詞。
在這題的規則中,單詞是如下規定的:
- 在字元迷陣中選取一個字元作為單詞的開頭;
- 選取右方、下方、或右下45度方向作為單詞的延伸方向;
- 以開頭的字元,以選定的延伸方向,把連續得到的若干字元拼接在一起,則稱為一個單詞。
以圖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;
}
}