【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; } };
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人