Acwing第68场周赛
第一题:4612.去掉0
分析:定义两个指针left和right分别放在第一个“1”的左侧和最后一个"1"的右侧,从left向right遍历字符串,用cnt记下0的个数并输出即可。
代码实现:
#include<iostream>
using namespace std;
int main()
{
int T;
cin>>T;
while(T--){
string s;
cin >> s;
if(s == "0") puts("0");
else{
int l = 0,r = 0;
for(int i = 0;i < s.size();i ++){
if(s[i] == '1') {
l = i;
break;
}
}
for(int i = s.size() - 1;i >= 0;i --){
if(s[i] == '1'){
r = i;
break;
}
}
int cnt = 0;
for(int i = l;i < r ;i ++){
if(s[i] == '0') cnt ++;
}
cout << cnt << endl;
}
}
return 0;
}
第二题:4613.方格跳跃
分析:找到第一次和最后一次出现“>”和“<”字符的地方,如果第一次左边出现了“<”或最后一次右边出现了“>”即有可能出界。
代码实现:
#include<iostream>
#include<vector>
using namespace std;
const int N = 1e5 + 10;
int main()
{
int n;
cin >> n;
string s;
cin >> s;
if(n == 1)
{
cout << "1" << endl;
}
else
{
int res = 0;
vector<int> v;
for(int i = 0;i < s.size() - 1;i ++)
if(s[i] == '>' && s[i + 1] == '<')v.push_back(i);
if(v.size()>0)
for(int i = 0;i < v[0];i ++)
if(s[i] == '<')res ++;
if(v.size() > 1)
for(int i = v[v.size() - 1] + 2;i < s.size();i++)
if(s[i] == '>')res ++;
if(v.size() == 0)res = n;
cout << res << endl;
}
return 0;
}
Leetcode第310场周赛
第一题:2404.出现最频繁的偶数元素
分析:先对nums数组排序,从小到大遍历数组,用hash表保存每个偶数出现的次数,在输出出现次数最多的偶数
代码实现:
class Solution {
public:
int mostFrequentEven(vector<int>& nums) {
unordered_map<int, int> xf;
for (int x: nums){
if (x % 2 == 0){
xf[x] ++;
}
}
if ((int)xf.size() == 0){
return -1;
}
int maxF = 0;
int res = 0;
for (auto [x, f]: xf){
if (f > maxF){
maxF = f;
res = x;
}else if (f == maxF){
if (x < res){
res = x;
}
}
}
return res;
}
};
第二题:2405.子字符串的最优化分
分析: 从左向右遍历字符串,用count函数计算vector中某个字符出现的次数,如果没出现过则用vector数组保存,否则用erase函数删除vector中该元素并且ans+1,表示子字符串个数+1
代码实现:
class Solution {
public:
int partitionString(string s) {
vector<char> sn;
int ans = 1;
for(int i = 0;i < s.size();++ i){
if(!count(sn.begin(),sn.end(),s[i])){
sn.push_back(s[i]);
}else{
sn.erase(sn.begin(),sn.end());
sn.push_back(s[i]);
++ ans;
}
}
return ans;
}
};