力扣 - 第300场周赛(补题)

第一题

解密消息

解题思路:

使用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;
    }
};

 

第二题

螺旋矩阵IV

解题思路:

使用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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值