思路:我在比赛中解这个题时,就是根据它的变化规则通过模拟还原了这个字符串s2。既然s1的第一个字母是来源于s2的中间,所以就把它放回s2 的中间,然后就用相同的方法不断的推出s1的每个字母来自于s2的哪个位置就这样进行模拟就行了。结果写了一个比较麻烦的代码,因为这个思路比较简单,所以在比赛中写的时候也没想过优化。
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int n;
while(cin>>n){
char s1[2005];
cin>>s1;
char s2[2005];
//在下面就是模拟的过程奇数长度和偶数长度会有所不同
if(n%2==0){
int tol=1;
for(int j=0;j<n;j++){
s2[n/2-tol+1]=s1[j];
j++;
s2[n/2+tol]=s1[j];
tol++;
}
}else{
int tol=1;
s2[n/2+1]=s1[0];
for(int j=1;j<n;j++){
s2[n/2+1-tol]=s1[j];
j++;
s2[n/2+1+tol]=s1[j];
tol++;
}
}
//主要上面写挫的地方是这里,这里优化一下应该是可以让代码更简洁的
//cout<<s<<endl;
for(int j=1;j<=n;j++){
cout<<s2[j];
}cout<<endl;
//写的是时候为了方便理解这个逻辑所以我下标就从1开始了。
}
}
虽然这样的思路也AC了,但是我自己却并不喜欢这个思路。这个题的正确的AC思路应该是下面这个代码。(这个代码是比较简洁的一个。)
#include<iostream>
using namespace std;
int n,i;
string s;
int main(){
cin >> n >> s;
//虽然一样是模拟,其实只要能多想一下应该马上就能想到这种方式模拟的,
for(i=n-2;i>=0;i-=2) cout << s[i];
for(i=1-n&1;i<n;i+=2) cout << s[i];
return 0;
}我个人是比较喜欢第二代码的,(虽然不是我写的 ^ - ^)。
本文介绍了解决一个特定编码挑战的方法,即如何通过一系列中间字符重建原始字符串。文章提供了两种不同的解决方案,一种是通过逐步模拟字符的删除过程来逆向构建字符串,另一种则是采用更为简洁的算法实现。

270

被折叠的 条评论
为什么被折叠?



