米哈游测试开发笔试算法题(2020-9-19)

1.旋转字符游戏:给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为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
输入:一行字符串,包含两个M,N,M和N均为大于0,小于10000的整数,M表示行,N表示列。
输出:M*N的矩阵,以空格分隔

思路:

        在这个矩阵中,是按照顺时针进行填入字母(右->下->左->上->右->......),而改变方向的条件为:

        1.到达边界

        2.下一个位置已经填入字母

这便是我们改变方向/结束递归的条件,我们可以使用一个等大小的矩阵(类型为bool),来判断是否已经填过。

        题目中要求:矩阵中元素取值为A-Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过Z时,又从A开始填充。所以可以采用第n个数为:

                                                        matrix[i][j] =  'A' + n % 26;

为了方便使用函数形参中给定sum表示总个数,count表示未达到(遍历)的个数,即:

                                                         n = sum - count

         当count == 1时,表示仅剩下最后一个位置没有到达,当填入字母后即可结束函数。

代码:

void spiralOrder(vector<vector<char>>& matrix, vector<vector<bool>>& isArrive, int i, int j, int m, int n, int k, int sum, int count)
{
	if (i < 0 || i >= m || j < 0 || j >= n || isArrive[i][j]) return; //边界条件

	if (1 == count && !isArrive[i][j]) //当到达最后一个位置时结束递归
	{
		matrix[i][j] = 'A' + (sum - count) % 26;
		isArrive[i][j] = true;
		return;
	}
	matrix[i][j] = 'A' + (sum - count) % 26; //当前位置该填入的字母
	isArrive[i][j] = true; //若到达则为true
	switch (k % 4)
	{
	case 0:
		if (j + 1 < n && !isArrive[i][j + 1]) //判断是否可以继续向右
			spiralOrderr(matrix, isArrive, i, j + 1, m, n, k, sum, --count);
		else
			spiralOrder(matrix, isArrive, i + 1, j, m, n, k + 1, sum, --count);
		break;
	case 1:
		if (i + 1 < m && !isArrive[i + 1][j]) //判断是否可以继续向下
			spiralOrder(matrix, isArrive, i + 1, j, m, n, k, sum, --count);
		else
			spiralOrder(matrix, isArrive, i, j - 1, m, n, k + 1, sum, --count);
		break;
	case 2:
		if (j - 1 >= 0 && !isArrive[i][j - 1]) //判断是否可以继续向左
			spiralOrder(matrix, isArrive, i, j - 1, m, n, k, sum, --count);
		else
			spiralOrder(matrix, isArrive, i - 1, j, m, n, k + 1, sum, --count);
		break;
	case 3:
		if (i - 1 >= 0 && !isArrive[i - 1][j]) //判断是否可以继续向上
			spiralOrder(matrix, isArrive, i - 1, j, m, n, k, sum, --count);
		else
			spiralOrder(matrix, isArrive, i, j + 1, m, n, k + 1, sum, --count);
		break;
	}
}
//打印矩阵
void printMatrix(vector<vector<char>>& matrix)
{
    for(int i = 0; i < matrix.size(); ++i)
    {
        for(int j = 0; j < matrix[0].size(); ++j)
            cout << matrix[i][j] << ' ';
        cout << endl;
    }
}

2、字符串匹配:给定一个字符串S和字符规律P,实现一个支持’.’、’*’、和’+'的正则匹配。
‘.’ 表示匹配任意单个字符
’ * '表示匹配0个或多个前面的那一个元素
‘+’表示匹配 1个或多个前面的那一个元素

输入:
mihayo
mih.*o

输出:ture
输入:
mihayo
mio+hoyo

输出:false

未更新......

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
米哈游Java后端笔试是面向Java后端开发岗位的一套笔试目,旨在考察应聘者对Java后端开发的理解和应用能力。 这套笔试目往往包含以下几个方面的内容: 1. Java语言基础:主要考察Java的基本语法、面向对象编程、常用类库等方面的知识。例如,常见的有关Java语言基础的目有:反射机制的理解和应用、线程的创建和使用、异常处理等。 2. 数据库相关知识:主要考察应聘者对数据库的基本理解和SQL的使用能力。例如,常见的数据库相关目有:数据库事务的概念和应用、数据库索引的优化策略、SQL语句的编写和调优等。 3. Web开发框架:主要考察应聘者对常用的Web开发框架的理解和应用能力。例如,常见的Web开发框架目有:Spring框架的注解使用、MyBatis的配置和映射关系等。 4. 系统设计和优化:主要考察应聘者对大型系统设计和性能优化的能力。例如,常见的系统设计和优化目有:数据库连接池的设计和实现、分布式系统的负载均衡策略、系统性能调优等。 总的来说,米哈游Java后端笔试是一套综合考察Java后端开发能力的目,内容涵盖了Java语言基础、数据库相关知识、Web开发框架以及系统设计和优化等方面。应聘者需要具备扎实的Java编程基础,熟悉常用的开发框架和工具,以及对大型系统的设计和性能优化有一定的了解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值