LeetCode周赛第300场总结&&AcWing周赛58场总结

LeetCode周赛300:

一、6108.解密消息

1、原题链接:6108.解密消息

2、解题思路:

        这题主要考察的就是哈希表的知识点,先用哈希表存下来每个字母的对应字母(即对照表),然后再遍历message字符串通过哈希表依次解密每个字母。

3、参考代码:

class Solution {
public:
    string decodeMessage(string key, string message) {
        unordered_map mp;
        int i = 0;
        for(auto ch : key){
            if(mp.count(ch) == 0 && ch != ' ') {
                mp[ch] = 'a' + i;
                i ++;
            }
        }
        
        int n = message.size();
        string res = "";
        for(int i = 0; i < n; i ++ ){
            if(message[i] != ' ') res += mp[message[i]];
            else res += ' ';
        }
        
        return res;
    }
    
};

二、6111.螺旋矩阵IV

1、原题链接:6111.螺旋矩阵IV

2、解题思路:

        本题是一个经典螺旋矩阵问题,利用方向矩阵依次螺旋遍历二维矩阵并赋值。

3、参考代码:

/**
 * 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> spiralMatrix(int m, int n, ListNode* head) {
        vector> res(m, vector(n, -1));
        int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
        int x = 0, y = 0, d = 1;
        for(int i = 0; i < n * m && head; i ++ ){
            res[x][y] = head->val;
            int a = x + dx[d], b = y + dy[d];
            if(a < 0 || a >= m || b < 0 || b >= n || res[a][b] != -1){
                d = (d + 1) % 4;
                a = x + dx[d], b = y + dy[d];
            }
            x = a, y = b;
            head = head->next;
        }

        return res;
    }
};

AcWing周赛58:

一、4488.寻找1

1、原题链接:4488.寻找1

2、解题思路:

        定义一个标志符(cnt = 0),每次输入进行判断,若输入为1,则标志符置1,最后判断标志符,若为0,则该序列中不含1,反之则有1。

3、参考代码:

#include

using namespace std;

int main()
{
    int n;
    cin >> n;
    int cnt = 0;
    for(int i = 0;i < n ; i ++ ){
        int x;
        cin >> x;
        if(x == 1) cnt = 1;
    }
    if(cnt == 1) cout << "YES" << endl;
    else cout << "NO" << endl;
    return 0;
}

二、4489.最长子序列

1、原题链接:4489.最长子序列

2、解题思路:

        本题主要是用双指针来解,对整个序列进行一个遍历,对每一段满足条件的子序列计算一下长度,并用res保存最长满足条件的子序列。

3、参考代码:

#include

using namespace std;

const int N = 2e5 + 10;

int a[N];

int main()
{
    int n;
    cin >> n;
    
    for(int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    
    int res = 0;
    for(int i = 0; i < n; i ++ ){
        int j = i + 1;
        while(j < n && a[j] <= a[j -1] * 2){
            j ++;
        }
        res = max(res, j - i);
        i = j - 1;
    }
    cout << res << endl;
    
    return 0;
}

你可能感兴趣的