解码

272 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目信息描述

定义一个单词中位于最中间的字母为中心字母。

如果单词的长度为偶数,则中心字母定义为中间两个字母中靠左的那个。

如果单词的长度为 11,则中心字母是它本身。

一种单词加密方式为:

  • 记录单词的中心字母,并将该字母在单词中删除。
  • 不断重复上述操作,直至单词被完全删除。
  • 将记录下的字母依次连接,得到加密后的单词。

例如,volga 经过加密可以得到 logva

现在,给定一个加密后的单词,请你求出原单词。

输入格式

第一行包含整数 nn,表示单词长度。

第二行包含一个长度为 nn 的小写字母构成的字符串表示加密后的单词。

输出格式

输出原单词。

数据范围

1≤n≤20001≤n≤2000

输入样例1:

5
logva

输出样例1:

volga

输入样例2:

2
no

输出样例2:

no

输入样例3:

4
abba

输出样例3:

baba

思路

根据样例看出来规律:

①、字符串长度为奇数。

  • s 串为 logva , ans 串为空串。
  • s 串第 1 个字符拼接到 ans 右边,得到 l
  • s 串第 2 个字符拼接到 ans 左边,得到 ol
  • s 串第 3 个字符拼接到 ans 右边,得到 olg
  • s 串第 4 个字符拼接到 ans 左边,得到 volg
  • s 串第 5 个字符拼接到 ans 右边,得到 volga

②、字符串长度为偶数。

  • s 串为 abba , ans 串为空串。
  • s 串第 1 个字符拼接到 ans 左边,得到 a
  • s 串第 2 个字符拼接到 ans 右边,得到 ab
  • s 串第 3 个字符拼接到 ans 左边,得到 bab
  • s 串第 4 个字符拼接到 ans 右边,得到 baba

所以结论就是,根据 s 串长度的奇偶性,往 ans 串两端交替拼接字符。

#include <iostream>
using namespace std;
​
int main()
{
    int n;
    string s, res = "";
    cin >> n >> s;
​
    if(n & 1) res += s[0], s.erase(0, 1), n --;
​
    for(int i = 0; i < n; i ++) {
        if(i % 2) res = res + s[i];
        else res = s[i] + res;
    }
​
    cout << res << endl;
    return 0;
}
​
​