笔试代码题--搜狗--旋转解密纸推导原密码

笔试代码题--搜狗--旋转解密纸推导原密码


题目描述:

两张卡片合并,旋转90°被涂鸦的透明解密纸3次,推导原密码。
给一个N*N的透明卡,有些格子被涂成黑色,1代表被涂,0代表没涂,然后旋转90°被涂鸦的透明解密纸3次,可以看出每个位置的对应字母,最后将原密码输出。

旋转函数方法就是:从原string2中按一定顺序读出数据,填入新的vector中,先读最后一行的第一个,然后将这行数据先存入新的数组中,填的位置是第一列,也是第j行,j从0到(size-1),所以按照res[j]存放。

主函数中,先将二维数组中可看到的值填入新的数组中,也就是string1[i][j]=='0'时,将string2中的当前位置的值存放进去。

实例1:

输入vector<string>s1

[110]

[011]

[011]

输入vector<string>s2:

[ABC]

[DEF]

[GHI]

输出:

[ABCDEFHGI]

代码如下:

class Solution {
public:
    
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     * 返回一行字符串,表示原文。
     * @param s1 string字符串vector N*N的01矩阵,表示解密纸,0表示透明,1表示涂黑
     * @param s2 string字符串vector 字符矩阵,表示密文
     * @return string字符串
     //旋转函数
vector<string> Rotate(vector<string>& vector1)
{
	vector<string> res(vector1.size());
	for (int i = vector1.size() - 1; i >= 0; i--)
	{
		for (int j = 0; j < vector1.size(); j++)
		{
			res[j].push_back(vector1[i][j]);
		}
	}
	return res;
}
string rotatePassword(vector<string>& s1, vector<string>& s2) {
	// write code here
	string res;

	for (int i = 0; i < s1.size(); i++)
	{
		for (int j = 0; j < s1.size(); j++)
		{
			if (s1[i][j] == '0')
			{
				res.push_back(s2[i][j]);
			}
		}
	}
	vector<string> rotate1 = Rotate(s1);
	for (int i = 0; i < s1.size(); i++)
	{

		for (int j = 0; j < s1.size(); j++)
		{
			if (rotate1[i][j] == '0')
			{
				res.push_back(s2[i][j]);
			}
		}
	}
	vector<string> rotate2 = Rotate(rotate1);
	for (int i = 0; i < s1.size(); i++)
	{

		for (int j = 0; j < s1.size(); j++)
		{
			if (rotate2[i][j] == '0')
			{
				res.push_back(s2[i][j]);
			}
		}
	}
	vector<string> rotate3 = Rotate(rotate2);
	for (int i = 0; i < s1.size(); i++)
	{

		for (int j = 0; j < s1.size(); j++)
		{
			if (rotate3[i][j] == '0')
			{
				res.push_back(s2[i][j]);
			}
		}
	}
	return res;
}
};

猜你喜欢

转载自blog.csdn.net/qq_41103495/article/details/108814520