赞
踩
#include<bits/stdc++.h> using namespace std; const int N=2e5+10; char backups[N]; char s[N]; void solve() { int n; cin>>n; for(int i=0;i<n;i++) cin>>s[i]; memcpy(backups,s,n); for(int i=0;i<n;i++) if(backups[i]=='a'||backups[i]=='e') backups[i]='V'; else backups[i]='C'; int case_tt=0; for(int i=0;i+3<n||i+2<n;) { if(i+2==n-1) { case_tt=1; break; } if(i+1==n-1) { case_tt=2; break; } if(backups[i]=='C'&&backups[i+1]=='V'&&backups[i+2]=='C'&&backups[i+3]=='C') { cout<<s[i]<<s[i+1]<<s[i+2]<<"."; i+=3; } else { cout<<s[i]<<s[i+1]<<"."; i+=2; } } if(case_tt==1) cout<<s[n-3]<<s[n-2]<<s[n-1]; else cout<<s[n-2]<<s[n-1]; cout<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin>>t; while(t--) solve(); return 0; }
非常激动啊
自己也是独立ac
了该题,写算法基础提高进阶或者算法进阶指南基本都是看题解,非常具有挫败感,现在感觉非常有成就感
题解的方法明显正统很多,我的方法显得笨拙
另外case
触发关键词了,所以直接报错,定义变量的时候需要注意不要和关键词有重叠
#include <bits/stdc++.h> using namespace std; const int MAX = 200'007; const int MOD = 1'000'000'007; void solve() { int n; cin >> n; string s; cin >> s; string res = ""; while (!s.empty()) { int x; if (s.back() == 'a' || s.back() == 'e') {x = 2;} else {x = 3;} while (x--) { res += s.back(); s.pop_back(); } res += '.'; } res.pop_back(); reverse(res.begin(), res.end()); cout << res << '\n'; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int tt; cin >> tt; for (int i = 1; i <= tt; i++) {solve();} // solve(); }
首先备份一下原来输入的字符串,(因为最近做了一些数组备份的题),然后把字母分类,把修改结果存到备份数组里面
遍历备份数组,如果发现是"CVCC"
就说明前面的需要三个一起输出,实际上出现两个连在一起的C
就行,出现两个连在一起的C
就表示前面需要输出三个,但是我感觉回退的这种难以表示,所以就用了一个比较长的判断,每三个或者两个字母输出之后,输出一个点,然后判断一下是不是最后三个字母或者两个字母,如果是的话,就跳出循环,单独输出最后两三个字母,因为不需要加点了(可以学着答案,用一个字符串保存答案,然后最叼最后一个点,感觉也可行)
注意判断是不是最后两三个字母需要在循环开始时就进行判断,主要因为字符串的长度可能不够
循环变量的更新方式是根据条件判断进行更新的,输出的时候输出的是原数组,条件判断使用的是备份数组
尝试修改了一下自己的代码,想要改的简洁一些,发现需要考虑的情况太多了,要考虑字符串的长度,各种边界情况
#include<bits/stdc++.h> using namespace std; void solve() { int n; cin>>n; string s; cin>>s; string res=""; while(!s.empty()) { int x=0; if(s.back()=='a'||s.back()=='e') x=2; else x=3; while(x--) { res+=s.back(); s.pop_back(); } res+='.'; } res.pop_back(); reverse(res.begin(),res.end()); cout<<res<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int t; cin>>t; while(t--) solve(); return 0; }
正解确实优雅,首先读入字符串,定义一个空的答案字符串,从最后一个字符开始遍历,如果最后一个字母是'V'
表示回退两格,另一种情况是回退三格,从后往前考虑确实简单一些,因为两种情况的区别就是最后一个字母,然后把字符加到答案字符串,加完之后加一个点,从后往前操作字符串其实类似于操作栈顶元素,每一次使用栈顶元素然后让栈顶元素出栈,最后多加了一个点,去掉那个点,把答案字符串翻转,就是最后的答案
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。