网易游戏(互娱)2019年-游戏研发/初级游戏研发/平台开发岗部分真题
1、[编程题]时钟
小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)。
每个测试用例占据一行内容,并是一个字符串格式:HH:MM:SS”,表示钟表显示的时间信息。
输出描述:
针对每一个测试点,生成一行数据.当钟表显示的时间确实属于真实存在的时刻时,则直接输出该时间而不作任何更改;否则生成一个新的HH:MM:SS格式的时间值,在此前提下使该时间值既满足修改最少数量字符的要求又具有最小的字典顺序.
输入例子1:
2
19:90:23
23:59:59
输出例子1:
19:00:23
23:59:59
不难,直接看代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
string str;
cin >> str;
if (str[0] > '2') str[0] = '0';
if (str[0] == '2') {
if (str[1] > '3') str[0] = '0';
}
if (str[3] > '5') str[3] = '0';
if (str[6] > '5') str[6] = '0';
cout << str << endl;
}
return 0;
}
2、[编程题]会话列表
小云正在参与开发即时通讯软件,并负责其中的会话管理模块。
对话列表以多行控件的形式显示,并自上而下排列;每个对话对应唯一标识符(ID),确保无重复标识。
每当用户向某个对话发送或接收消息时:如果该对话已存在于对话列表中,则将其移动至顶端;若尚未出现,则将其插入至顶端。
为了测试系统性能和稳定性,在此阶段小云将首先清空对话列表并等待新消息的接入。
完成接收大量来自不同对话的消息后,在此阶段小云将输出当前状态的对话列表,并检查是否存在潜在问题。
输入描述:
测试数据的数量由变量T决定(其中T≤10)。接下来将依次处理每组测试用例。
每组测试用例包含多个条目。每个条目包括两部分信息:第一部分是一个介于1和200之间的整数值N;第二部分则是一系列按时间顺序排列的会话标识符。
这些会话标识符都是不超过一千万的不同整数值。
输出描述:
对于每一批次的数据样本,在处理时需按给定的顺序依次生成对应的预测结果。
输入例子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
栈+unordered_map,栈存储数据,unordered_map存储多次传输的会话
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
for (int i = 0; i < T; i++) {
int N;
cin >> N;
stack<int> res;
unordered_map<int, int> pmap;
for (int j = 0; j < N; j++) {
int tmp;
cin >> tmp;
res.push(tmp);
// pmap[tmp]++;
}
while (!res.empty())
{
pmap[res.top()]++;
if (pmap[res.top()] > 1) {
res.pop();
}
else
{
cout << res.top() << ' ';
res.pop();
}
}
cout << endl;
}
return 0;
}
[编程题]字符迷阵
参与者应在设定好的矩形字符迷阵中寻找特定词汇。 在本题的规定中,请遵循以下规定来确定单词: (1)从字符迷阵中选择一个字符作为单词起始点; (2)以右方、下方或右下方45度方向作为扩展路径; (3)从起始点出发,在选定的方向上连接连续产生的字符序列即构成该单词。
以图1为例,在其中查找特定单词"WORD"时,则位于绿色框标记的位置均为有效的候选区域;而位于红色框标记的位置则均不满足条件。
现在的问题是在给定一个字符迷阵以及一个需要查找的目标词的情况下,请确定在该字符迷阵中能够找到多少个符合要求的目标词分布模式。
需要注意的是这些有效的分布模式是可以相互重叠出现的情况;如图1所示的例子中,“WORD”这个词组共有4种不同的有效分布模式。
输入描述:
输入的第一行为一个正整数T(1≤T≤9),表示测试数据的数量。
每组测试数据包含多个部分:
首先是一组由两个整数组成的初始参数:m和n(1≤m,n≤99),分别表示字符迷阵的具体维度(即行列的数量)。
接着是m个由单个字符组成的字符串(每个字符串长度固定为n),这些字符串依次排列了每一行的具体内容。
最后还有一个单独的目标字符串需要查找。
所有输入中的字符均为大写字母,并且目标单词的长度介于2至9个字符之间。
对于所有测试用例而言:
它们都满足以下条件:
总共有1至9组测试用例;
每个测试用例中的字符均为大写字母;
目标单词最短2个字母最长9个字母;
整个迷阵的最大尺寸不超过9×9;
其中一半以上的数据中迷阵的最大尺寸不超过20×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
注意输入,题目只要求向右、向下或向右下即可
#include <bits/stdc++.h>
using namespace std;
int main() {
int T;
cin >> T;
for (int i = 0; i < T; i++) {
int m, n;
cin >> m >> n;
vector<string> tmp;
int count = 0;
for (int j = 0; j < m; j++) {
string ss;
cin >> ss;
tmp.push_back(ss);
}
string ans;
cin >> ans;
for (int j = 0; j < m; j++) {
for (int k = 0; k < n; k++) {
if (tmp[j][k] == ans[0]) {
// 向右延申
for (int z = 1; z < ans.size(); z++) {
if (k + z >= n) break;
if (tmp[j][k + z] != ans[z]) break;
if (z == ans.size() - 1) ++count;
}
// 向下延申
for (int z = 1; z < ans.size(); z++) {
if (j + z >= m) break;
if (tmp[j+z][k] != ans[z]) break;
if (z == ans.size() - 1) ++count;
}
// 向右下延申
for (int z = 1; z < ans.size(); z++) {
if (j + z >= m || k + z >= n) break;
if (tmp[j + z][k + z] != ans[z]) break;
if (z == ans.size() - 1) ++count;
}
}
}
}
cout << count << endl;
}
return 0;
}
