A28819. 字母移位
填空题
困难
知识点
题目描述
字母移位
题目描述
字母移位:表示将字母按照字母表的顺序进行移动。
例如:'b' 向右移动一位是'c’,'f'向左移动两位是'd'。
特别地,'a'向左移动一位是'z','z'向右移动一位是'a'。
给定一个仅包含小写字母且长度为 n 的字符串 s,以及 n 个正整数 a1,a2,a3……an,接下来对字符串s按如下规律操作:
1.将第 1位字符向左移动 a1 位;
2.再将第 1、2 位字符都向右移动 a2位;
3.再将第 1、2、3 位字符都向左移动 a3位;
4.再将第 1、2、3、4 位字符都向右移动 a4位;
以此类推,直到将s的第1到第n位字符都(按规律向左或向右)移动an 位。
最后,将操作完成后的字符串s输出。
例如:n=5,字符串s="abcde",5 个正整数为1,3,5,7,9;
将"abcde"的第 11 位字符"a"向左移动 1位,s变为"zbcde"
再将"zbcde"的前 2 位字符"zb" 向右移动 3 位,s变为"cecde"
再将"cecde" 的前 3位字符"cec"向左移动5 位,s 变为"xzxde"
再将"xzxde" 的前 4 位字符"xzxd"向右移动7 位,s变为"egeke"
再将"egeke"的前 5 位字符"egeke" 向左移动 9 位,s 变为"vxvbv"。
最后,将操作完成后的字符串"vxvbv"输出。
输入格式
第一行输入一个整数n(1≤n≤105)
第二行输入一个仅包含小写字母且长度为 n的字符串s
第三行输入 n个整数a1、a2…an(1≤a≤10^9),整数之间以一个空格隔开
输出格式
输出一个字符串,表示操作完成后的字符串s
输入样例
5
abcde
1 3 5 7 9输出样例
vxvbv参考答案
#include <iostream>
using namespace std;
string s;
// 将要移位的字符串
int n, a[100001], b[100001];
// n 为字符串长度,a用于存储输入的每步移位量,b 用于存储前缀和
int main() {
cin >> n;
// 输入字符串的长度
cin >> s;
// 输入字符串
for (int i = 1; i <= n; i++) {
cin >> a[i];
// 输入每个位置的移位量
a[i] %= 26;
// 将移位量对 26 取模(因为一个循环之后字母会回到原位)
if (i & 1) {
// 如果 i 是奇数
a[i] *= -1;
// 则反转移位的方向,因为题目要求奇数次的移位要向左
}
}
b[n] = a[n];
// 初始化 b 数组的最后一个元素
for (int i = n - 1; i >= 1; i--) {
b[i] = (a[i] + b[i + 1]) % 26;
// 逆序计算 b 数组,即前缀和数组,用于存储最终的移位量
}
for (int i = 1; i <= n; i++) {
// 遍历字符串中的每个字符
int x = s[i - 1] - 96;
// 字母转换为 1-26 的数字('a' 转换为 1,'z' 转换为 26)
if ((x + b[i]) % 26 == 0) {
//如果移位后字母应该变成 'z'
s[i - 1] = 'z';
continue;
}
s[i - 1] = char((x + b[i] + 26) % 26 + 96);
// 应用最终的移位量,并将数字转换回字符
}
cout << s;
// 输出移位后的字符串
return 0;
// 程序正常结束
}
上一题
下一题