力扣
一.出现最频繁的偶数元素
1.原题链接:力扣
2.解题思路:
用哈希表存储每个元素出现的次数,再遍历,若遇到符合要求的偶数,则把新的X赋值给ans,新的y赋值给best,输出ans即可;
3.参考代码:
class Solution {
public:
int mostFrequentEven(vector<int>& nums) {
unordered_map<int, int>mp;
for(auto & x : nums)mp[x]++;
int ans = -1, best = 0;
for(auto it = mp.begin(); it != mp.end(); it++){
int x = it -> first;
int y = it -> second;
if(x % 2)continue;
if(y > best || (y == best && x < ans))ans = x, best = y;
}
return ans;
}
};
二.子字符串的最优划分
1.原题链接:力扣
2.解题思路:
每当出现重复字母时再划分,因此维护一个res[x]表示字母x是否出现过,若出现重复字母则清空res,分组加一;
3.参考代码:
class Solution {
public:
int partitionString(string s) {
vector<int>res(26);
int ans = 0;
for(int i = 0; i < s.length(); i++){
if(res[s[i] - 'a']){
ans++;
res.assign(26, 0);
res[s[i] - 'a'] = 1;
}
else{
res[s[i] - 'a'] = 1;
}
}
return ans + 1;
}
};
AcWing
一.去掉0
1.原题链接:4612. 去掉0 - AcWing题库
2.解题思路:
用 i 和 j 分别去掉前面的0和后面的0,再统计中间剩下的0的个数就是需要删除的最小0的数量;
3.参考代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int T;
cin >> T;
while(T--){
string s;
cin >> s;
int ans = 0;
int i = 0, j = s.length() - 1;
while(i < s.length() && s[i] == '0')i++;
while(j >= 0 && s[j] == '0')j--;
for(int k = i; k <= j; k++){
if(s[k] == '0')ans++;
}
cout << ans << endl;
}
return 0;
}
二.方格跳跃
1.原题链接:4613. 方格跳跃 - AcWing题库
2.解题思路:
统计左边的“<”数量和右边的“>”数量之和,因为在这个后缀和前缀里的任何一个点肯定都是能走出边境的,输出总和即可;
3.参考代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int main()
{
int len, res;
string str;
cin >> len >> str;
for (int i = 0; i < len && str[i] == '<'; i++) res++;
for (int i = len - 1; i >= 0 && str[i] == '>'; i--) res++;
cout << res << endl;
return 0;
}