随笔 - 40  文章 - 0  评论 - 0  阅读 - 1190

【2022/05/01-第291场单周赛】复盘

总结

这次换到了美服做,然后起晚了+英文渣看错题,当了一波韭菜,血亏!

Q1.移除指定数字得到的最大结果

从前往后若某个给定数后面的数大于它就移除他,若没有则移除最后一个给定数。

class Solution {
public:
string removeDigit(string s, char digit) {
for(int i = 0; i < s.size() - 1; ++i){
if(s[i] == digit && s[i + 1] > s[i]){
s.erase(s.begin() + i);
return s;
}
}
for(int i = s.size() - 1; i >= 0; --i){
if(s[i] == digit){
s.erase(s.begin() + i);
return s;
}
}
return s;
}
};

更暴力的办法,一个一个移除。

class Solution {
public:
string removeDigit(string s, char digit) {
string ret;
for(int i = 0; i < s.size(); ++i){
if(s[i] == digit){
if(s.substr(0, i) + s.substr(i + 1, s.size() - i - 1) > ret){
ret = s.substr(0, i) + s.substr(i + 1, s.size() - i - 1);
}
}
}
return ret;
}
};

Q2.必须拿起的最小连续卡牌数

用哈希表把每个数的所有坐标都存下来然后找最小距离。

class Solution {
public:
int minimumCardPickup(vector<int>& cards) {
int ret = INT_MAX;
unordered_map<int, vector<int>> mp;
int n = cards.size();
for(int i = 0; i < n; ++i){
mp[cards[i]].push_back(i);
}
for(auto v : mp){
if(v.second.size() == 1) continue;
for(int i = 0; i < v.second.size() - 1; ++i){
ret = min(ret, v.second[i + 1] - v.second[i] + 1);
}
}
if(ret == INT_MAX) return -1;
return ret;
}
};

只存每个数上一个坐标

class Solution {
public:
int minimumCardPickup(vector<int>& cards) {
int ret = INT_MAX;
unordered_map<int, int> mp;
int n = cards.size();
for(int i = 0; i < cards.size(); ++i){
if(mp.find(cards[i]) == mp.end()) mp[cards[i]] = i;
else {
ret = min(ret, i - mp[cards[i]] + 1);
mp[cards[i]] = i;
}
}
if(ret == INT_MAX) return -1;
return ret;
}
};

Q3.含最多 K 个可整除元素的子数组

比赛的时候没看到子数组是连续元素组成的,直接麻了。
用数组转字符串的哈希表来存储不同满足条件的子数组。

class Solution {
public:
int countDistinct(vector<int>& nums, int k, int p) {
unordered_set<string> st;
int n = nums.size();
for(int i = 0; i < n; ++i){
string temp;
int cnt = 0;
for(int j = i; j < n; ++j){
if(nums[j] % p == 0) ++cnt;
if(cnt > k) break;
temp += "#";
temp += to_string(nums[j]);
st.insert(temp);
}
}
return st.size();
}
};

还可以用字典树去重,之后再学学。

Q4.字符串的总引力

记录下每个字母所有下标。
对于从i开始的所有子字符串,每个字母第一次出现之后的每个字符串吸引力都会+1。

class Solution {
public:
long long appealSum(string s) {
vector<int> h[26];
long long n = s.size(), ret = 0;
for(int i = 0; i < n; ++i) h[s[i] - 'a'].push_back(i);
for(int i = 0; i < 26; ++i) reverse(h[i].begin(), h[i].end()); // 防止去掉元素超时
for(int i = 0; i < n; ++i){
for(int j = 0; j < 26; ++j){
if(!h[j].empty() && h[j].back() < i) h[j].pop_back();
if(!h[j].empty()) ret += n - h[j].back();
}
}
return ret;
}
};
posted on   damnglamour  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示