题目
-
2075 解码斜向换位密码
-
2076.处理含限制条件的好友请求
思路与算法
- 第三题是一个比较简单的索引计算题,只需要将斜着放的字符先顺着找回来拼接起来,再做去空格处理,最后输出即可。用栈也行,用vector也行,用str也行,用str现成的函数操作起来比较方便。
- 并查集配合哈希表维护即可,比较复杂,只附代码。
代码实现
- 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);
}
};
- 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;
}
};
写在最后
睡了睡了