20211130:力扣第267周周赛(下)

这篇博客分享了解决力扣周赛中两道题目的思路和代码实现。第一题是2075解码斜向换位密码,通过遍历矩阵并拼接字符解决;第二题2076处理含限制条件的好友请求,使用并查集与哈希表进行判断和合并。提供了详细的算法解析和C++代码实现。
摘要由CSDN通过智能技术生成

力扣第267周周赛(下)

题目

  1. 2075 解码斜向换位密码
    在这里插入图片描述

  2. 2076.处理含限制条件的好友请求

在这里插入图片描述

思路与算法

  1. 第三题是一个比较简单的索引计算题,只需要将斜着放的字符先顺着找回来拼接起来,再做去空格处理,最后输出即可。用栈也行,用vector也行,用str也行,用str现成的函数操作起来比较方便。
  2. 并查集配合哈希表维护即可,比较复杂,只附代码。

代码实现

  1. 2075 解码斜向换位密码
class Solution {
public:
    string decodeCiphertext(string encodedText, int rows) {
        // 总长度
        int len = encodedText.size();
        // 计算总列数c
        int c = len / rows;
        // 待拼接字符串初始化
        string org;
        // 遍历
        // 遍历每一列
        for (int k = 0; k < c; ++k) {
            // 每一行
            for (int i = 0, j = k; j != c && i != rows; ++j, ++i) {
                // 斜向拼接对应位置的字符即可
                org += encodedText[i * c + j];
            }
        }
        // 去除掉空格,
        int i = org.size() - 1;
        while(i >= 0 && org[i] == ' ')
            i--;
        // 从索引0开始往后取i个字符作为结果返回即可
        return org.substr(0,i + 1);
    }
};
  1. 2076.处理含限制条件的好友请求
class Solution {
    vector<int> parent;
    int root(int x) { return (parent[x] == -1 || parent[x] == x) ? x : root(parent[x]); };
public:
    vector<bool> friendRequests(int n, vector<vector<int>>& restrictions, vector<vector<int>>& requests) {
        vector<unordered_set<int>> friends(n);
        for (int i = 0; i < n; i++) {
            friends[i].insert(i);
        }
        vector<unordered_set<int>> enemies(n);
        for (auto& res : restrictions) {
            enemies[res[0]].insert(res[1]);
            enemies[res[1]].insert(res[0]);
        }  
        parent = vector<int>(n, -1);
        auto requests_size = requests.size();
        vector<bool> result(requests_size, true);
        for (int i = 0; i < requests_size; i++) {
            int x = root(requests[i][0]), y = root(requests[i][1]);
            if (x == y) continue;
            if (friends[x].size() < friends[y].size()) swap(x, y);
            [&]{
                for (auto people : friends[y]) {
                    // 如果有一个`people`出现在`x`维护的仇人名单`enemies[x]`中
                    if (enemies[x].count(people) != 0) {
                        // 交朋友就失败了
                        result[i] = false;
                        // 立刻滚蛋(相当于goto匿名函数末尾)
                        return;
                    }
                }
                enemies[x].insert(enemies[y].begin(), enemies[y].end());
                friends[x].insert(friends[y].begin(), friends[y].end());
                parent[y] = x;
            }();
        }
        return result;
    }
};

写在最后

睡了睡了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IMMUNIZE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值