题解:洛谷 B4003 移位
【题目来源】
洛谷:B4003 [GESP202406 三级] 移位 - 洛谷
【题目描述】
小杨学习了加密技术移位,所有大写字母都向后按照一个固定数目进行偏移。偏移过程会将字母表视作首尾相接的环,例如当偏移量是3的时候,大写字母A会替换成D,大写字母Z会替换成C,总体来看大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ会被替换成DEFGHIJKLMNOPQRSTUVWXYZABC。
注:当偏移量是26的倍数时,每个大写字母经过偏移后会恰好回到原来的位置,即大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ经过偏移后会保持不变。
【输入】
第一行包含一个正整数n。
【输出】
输出在偏移量为n的情况下,大写字母表ABCDEFGHIJKLMNOPQRSTUVWXYZ移位替换后的结果。
【输入样例】
3
【输出样例】
DEFGHIJKLMNOPQRSTUVWXYZABC
【核心思想】
-
问题分析:给定偏移量 \(n\),将大写字母表 A-Z 进行循环移位,每个字母向后偏移 \(n\) 位(Z 之后回到 A)。这是一个字符串循环移位问题,核心在于利用取模运算实现字母表的环形偏移。
-
算法选择:
- 取模循环:利用 \((i + n) \bmod 26\) 实现字母表的环形偏移,\(i\) 为原字母在 A-Z 中的位置(\(0\)-\(25\))
-
关键步骤:
- 读入数据:读取 \(n\)
- 生成移位后字母表(\(i\) 从 \(0\) 到 \(25\)):
- \(j \leftarrow (i + n) \bmod 26\):计算偏移后的位置
- \(ch \leftarrow 'A' + j\):转换为对应字符
- 输出 \(ch\)
- 输出结果:连续输出 \(26\) 个字符
-
时间/空间复杂度:
- 时间复杂度:\(O(26) = O(1)\)
- 空间复杂度:\(O(1)\)
-
循环移位与取模的核心思想:
- 环形映射:将字母表视为长度为 \(26\) 的环,偏移 \(n\) 位等价于在环上前进 \(n\) 步。取模运算 $ \bmod 26$ 自然处理越界情况,如 Z(\(25\)) 偏移 \(3\) 位:\((25 + 3) \bmod 26 = 2\),对应 C
- 偏移量归一化:当 \(n\) 是 \(26\) 的倍数时,\((i + n) \bmod 26 = i\),字母表不变。取模运算自动处理任意大小的偏移量,无需预处理
- 字符编码的连续性:ASCII 码中大写字母 'A'-'Z' 是连续编码的,利用
'A' + j可直接得到对应字符,无需查表 - 适用于基础字符串变换、循环移位类入门问题
【算法标签】
入门 #字符串入门
【代码详解】
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
for (int i=0; i<26; i++) {
int j = (i+n) % 26; // j:字符偏移后离'A'的距离
char ch = 'A' + j; // ch:距离'A'为j的字符
cout << ch; //输出偏移后的字符
}
return 0;
}
【运行结果】
3
DEFGHIJKLMNOPQRSTUVWXYZABC
浙公网安备 33010602011771号