T1:解密消息
这个题目的主要意思就是根据题目给的key构造一个新的字母表,然后将message中的字母对应的位置再对应到正确的字母表,拼接成正确的信息。所以我们可以用遍历key用哈希表存储每个字母出现的位置,然后直接在message中将字母对应位置进行替换。
class Solution {
public:
string decodeMessage(string key, string message) {
unordered_map<char , int >hash;
int cnt = 0;
for(auto &c : key){
if( islower (c) && hash.count(c) == 0){
hash[c] =cnt++;
}
}
for(auto &ch :message){
if(islower(ch)){
ch = hash[ch] + 'a' ;
}
}
return message;
}
};
T2:螺旋矩阵IV
这个题目和螺旋矩阵比较像,不过螺旋矩阵式给出矩阵得到所有元素,这个题是给出所有元素求矩阵。
思路大体是一致的,先定义一个矩阵,将所有元素置为-1,然后再进行螺旋替换矩阵中的元素。
/**
* 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) {
vector<vector<int>> matrix(m, vector<int>(n, -1));
int left = 0, right = n - 1, top = 0, bottom = m - 1;
while (left <= right && top <= bottom) {
bool flag = false;
for (int i = left; i <= right; ++i) {
if (!head) {
flag = true;
break;
}
matrix[top][i] = head->val;
head = head->next;
}
if (flag) break;
top += 1;
if (top > bottom) break;
for (int i = top; i <= bottom; ++i) {
if (!head) {
flag = true;
break;
}
matrix[i][right] = head->val;
head = head->next;
}
if (flag) break;
right--;
if (left > right) break;
for (int i = right; i >= left; --i) {
if (!head) {
flag = true;
break;
}
matrix[bottom][i] = head->val;
head = head->next;
}
if (flag) break;
bottom--;
if (top > bottom) break;
for (int i = bottom; i >= top; --i) {
if (!head) {
flag = true;
break;
}
matrix[i][left] = head->val;
head = head->next;
}
if (flag) break;
left++;
if (left > right) break;
}
return matrix;
}
};