米哈游测试开发笔试算法题(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

未更新......

猜你喜欢

转载自blog.csdn.net/H_Greddy/article/details/126015696