笔试代码题--搜狗--旋转解密纸推导原密码
题目描述:
两张卡片合并,旋转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;
}
};