【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;
}
};
浙公网安备 33010602011771号