第一题
解题思路:
使用unordered_map<char,char>来形成对照表
class Solution
{
public:
string decodeMessage(string key, string message)
{
unordered_map<char,char> m;
string s="abcdefghijklmnopqrstuvwxyz";
int n=0;
for(auto &k:key)//形成对照表
if(m.count(k)==0&&k!=' ')//注意count的使用
m[k]=s[n++];
string ans="\0";
for(auto &e:message)//按照对照表替换message中的每个字母
{
if(e==' ')
ans+=e;
else
ans+=m[e];
}
return ans;
}
};
第二题
解题思路:
使用short dir[4][2]来代表前进方向,使用int d来维护前进方向
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution
{
public:
vector<vector<int>> spiralMatrix(int m, int n, ListNode* head)
{
int i=0,j=0,d=0;
//dir数组每一行的第0列用来控制行数
//dir数组每一行的第1列用来控制列数
//每一行分别代表向右、向下、向左、向上
short dir[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
vector<vector<int>> A(m,vector<int>(n,-1));//首先,m行n列的矩阵的每个空格用-1填充
while(true)
{
A[i][j]=head->val;//然后,填写当前节点的值到矩阵中
head=head->next;//更新到下一个节点
if(head==nullptr)//整个链表的值已经填写完整,跳出外层while循环
break;
int ii,jj;
while(true)
{
ii=i+dir[d][0];
jj=j+dir[d][1];
//先尝试以当前的方向前进一格
//如果超出了矩阵的范围或者前进到了之前填充过数值的格子,就需要改变前进方向
if(ii<0||jj<0||ii>=m||jj>=n||A[ii][jj]!=-1)
d=(d+1)%4;//通过发现规律来改变d的值,以达到改变前进方向的目的
else//的确可以以当前的方向前进一格,跳出内层while循环
break;
}
i=ii; j=jj;//更新当前坐标
}
return A;
}
};