米哈游招聘题目汇总
作者:互联网
米哈游笔试题目
Q1:
1、类型:测试开发
2、题面:
旋转字符游戏:给定两个整数M,N,生成一个MN的矩阵,矩阵中元素取值为A-Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过Z时,又从A开始填充。例如,当M=5,N=8时。矩阵中的内容如下:
A B C D E F G H
V W X Y Z A B I
U J K L M N C J
T I H G F E D K
S R Q P O N M L
3、输入输出示例
输入:一行字符串,包含两个M,N,M和N均为大于0,小于10000的整数,M表示行,N表示列
输出:MN的矩阵,以空格分隔
Q2:
1、类型:测试开发
2、题面:
字符串匹配:给定一个字符串S和字符规律P,实现一个支持‘.’、‘’、和‘+’的正则匹配。
‘.’表示匹配任意单个字符;
‘’表示匹配0个或多个前面的那一个元素;
‘+’表示匹配 1个或多个前面的那一个元素.
输入:第一行待匹配字符串S,第二行字符规律P
输出:true 或 false
3、输入输出示例:
①输入:
mihayo
mih.*o
输出:ture
②输入:
mihayo
mio+hoyo
输出:false
Q3:
1、类型:不知
2、题面:
给定无序整数数组,其构成方式如下:
首先给出1到n这n个连续不重复的数,随机移除其中一个数,再随机将剩下的数中的一个数重复一次,最后打乱当前得到的数组。请找出这两个数。
3、输入输出示例:
输入:3 5 6 5 4 1(构成方式:n=6,初始数组1 2 3 4 5 6,移除2,重复5,打乱得3 5 6 5 4 1)
输出 2 5
Q4:
1、类型:不知
2、题面:
找队友,如果A和B时队友,B和C时队友,则A和C是队友,随机抽取2个人,判断是否为队友。
例如:<A,B> <C,B> <D,E> 是队友,那么A,C是队友,A,D不是队友,A,E也不是队友.
3、输入输出示例:
输入:实际输入为员工编号
输出:1001,1003,1005,1003,1008,1010
Q5:
1、类型:不知
2、题面:
Plus:一些文字整理:
1、游戏客户端:游戏客户端开发需要哪些能力?对于一个游戏程序员来说,需要的不仅仅是编程能力和游戏制作相关工具的使用能力,还有三维数学与计算机图形学的专业知识和对游戏开发技术的学习能力,和策划/美术沟通的能力,对一个游戏需求复杂度的分析能力,游戏项目经历,等等。米哈游可能还会考量面试者对二次元文化/二次元游戏的了解程度。
Unity水平只是这里面的工具使用能力,只是面试官考察的一项,虽然比较重要,但如果对UE4/Cocos2D有了解的话其实是一样的。有985/海外高校计算机/数学学科的学历,有较强的编程能力,对计算机操作系统等学科有系统深入的了解,或者有不错的游戏项目经历那么无论是否有Unity经验都可能会被录用。
若答主对上面我提到的这些都没有深入了解的话,那么熟练的Unity3d的使用和C#编程一样可以让面试官认可你。这种情况下完全理解Unity官网中级以下的教程并使用Unity独立开发一款完整的3d战斗游戏或是独立负责其中的编程工作的level是不可少的。
整理:
- 编程能力和游戏制作工具(引擎的使用)是基本功
- 三维数学、计算机图形学是游戏客户端开发的必备知识
- 项目经历是巨大的加分项
- 学习能力、沟通能力是必不可少的软技能
- 作为程序员,一些系统的知识(数据结构与算法、操作系统、计算机组成原理、设计模式、计算机网路等)是必不可少的
- Unity要懂的,UnReal是未来发展方向
2、两个编程题都至少是leetcode-Hard级别的:一个正则表达式匹配,一个类似打家劫舍(二叉树形)。
3、监控二叉树
4、可爱的一个公司,从题里面都可以看出来。
先是10道多选题,都是在应该都是在网上可以查到的那种,把牛客都做一遍就行。
然后是两道编程,一看就是leedcode上的问题,难度适中,需要想一下才知道答案。
---1.leetcode 1249 - 移除无效的括号
比较简单
在此提供两种解题思路
------First:
string minRemoveToMakeValid(string s)
{
stack<int> _stack;
vector<int> deleteVector;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(')
{
_stack.push(i);
}
else if (s[i] == ')')
{
if (!_stack.empty())
{
_stack.pop();
}
else
{
deleteVector.push_back(i);
}
}
}
// 此时栈中的元素和deleteVector中的元素是需要删除的元素
// 还要注意的是删除的时候要从后面往前面删除,不然i所指向的位置就不对了
while (!_stack.empty() || !deleteVector.empty())
{
if (_stack.empty())
{
while (!deleteVector.empty())
{
s.erase(deleteVector.back(), 1);
deleteVector.pop_back();
}
}
else if (deleteVector.empty())
{
s.erase(_stack.top(), 1);
_stack.pop();
}
else
{
s.erase(_stack.top() > deleteVector.back() ? _stack.top() : deleteVector.back(), 1);
if (_stack.top() > deleteVector.back())
{
_stack.pop();
}
else
{
deleteVector.pop_back();
}
}
}
return s;
}
------Second:
string minRemoveToMakeValid1(string s)
{
// 上个算法是左右括号分开计算的,这次要写二者合二为一的算法
vector<int> deleteStack;
for (int i = 0; i < s.size(); i++)
{
if (s[i] == '(')
{
deleteStack.push_back(i);
}
else if (s[i] == ')')
{
// 对于右括号找第一个配对的左括号删除,没有则压栈,栈为空也压栈
if (!deleteStack.empty())
{
bool flag = true;
// 此处应该用迭代器,而不是数组访问方式
/*
for (int j = deleteStack.size () - 1; j >= 0; j--) {
if (deleteStack [j] == '(') {
// 忽略这个右括号,并且从删除栈中删除左括号
deleteStack.erase (j);
flag = true;
break;
}
}
/**/
for (vector<int>::iterator item = deleteStack.end() - 1; item >= deleteStack.begin(); item--)
{
if (s[(*item)] == '(')
{
deleteStack.erase(item);
flag = false;
break;
}
}
// 这个右括号需要删除
if (flag)
deleteStack.push_back(i);
}
else
{
deleteStack.push_back(i);
}
}
}
// 此时只需要删除栈中元素即可
while (!deleteStack.empty())
{
s.erase(deleteStack.back(), 1);
deleteStack.pop_back();
}
return s;
}
---2.leetcode 1035 - 不相交的线
int longestCommonSubsequence(string text1, string text2)
{
int dp[100][100];
for (int i = 0; i < text1.length(); i++)
{
for (int j = 0; j < text2.length(); j++)
{
if (text1[i] == text2[j])
{
// 相等则左上角加
if (i == 0 || j == 0)
{
dp[i][j] = 1;
}
else
{
dp[i][j] = dp[i - 1][j - 1] + 1;
}
}
else
{
if (i == 0 || j == 0)
{
if (i == 0 && j == 0)
{
dp[i][j] = 0;
}
else if (i == 0)
{
dp[i][j] = dp[i][j - 1] > 0 ? dp[i][j - 1] : 0;
}
else if (j == 0)
{
dp[i][j] = dp[i - 1][j] > 0 ? dp[i - 1][j] : 0;
}
}
else
{
dp[i][j] = dp[i - 1][j] > dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1];
}
}
}
}
return dp[text1.length() - 1][text2.length() - 1];
}
这道题还是挺有意思的,本来是一个无从下手的问题,但是可以把问题转换成找最长公共子序列却非常的简单。其实只有所有的线不相交才能是最长子序列,二者其实是互补的。所以只需要动态规划建一张动态表就可以实现。最后返回表的最后一个选项即可。
5、https://www.nowcoder.com/search?type=blog&query=%E7%B1%B3%E5%93%88%E6%B8%B8
牛客网面经
6、
标签:题目,汇总,back,else,米哈,deleteStack,deleteVector,stack,dp 来源: https://www.cnblogs.com/deeplower-dreamer/p/14420727.html