第一题
暴力
class Solution {
public:
string removeDigit(string number, char digit) {
string res = "";
for(int i=0; i<number.size(); i++){
if(number[i] == digit){
string t = number.substr(0, i) + number.substr(i+1, number.size()-i);
if(t > res){
res = t;
}
}
}
return res;
}
};
第二题
哈希表保存最近的位置
class Solution {
public:
int minimumCardPickup(vector<int>& cards) {
map<int, int> map;
int res = INT_MAX, n =cards.size();
for(int i=0; i<n; i++){
if(map.count(cards[i])){
if(res > i-map[cards[i]]){
res = i - map[cards[i]]+1;
}
}
map[cards[i]] = i;
}
return res == INT_MAX ? -1 : res;
}
};
第三题
暴力
class Solution {
public:
int countDistinct(vector<int>& nums, int k, int p) {
int n = nums.size();
unordered_set<string> set;
for(int i=0; i<n; i++){
string t;
int cnt = 0;
for(int j=i; j<n; j++){
if(nums[j]%p == 0) cnt++;
if(cnt > k) break;
t += to_string(nums[j])+"|";
set.insert(t);
}
}
return set.size();
}
};
第四题
动态规划
class Solution {
public:
long long appealSum(string s) {
int n = s.size();
vector<int> f(n);
// 单个字母也有引力,所以默认 -1
vector<int> pos(26, -1);
pos[s[0]-'a'] = 0;
f[0] = 1;
for(int i=1; i<n; i++){
f[i] = f[i-1] + i - pos[s[i]-'a'];
// 更新最近字母的位置
pos[s[i]-'a'] = i;
}
long long res = 0;
for(int i=0; i<n; i++) res += f[i];
return res;
}
};