GESP202406 三级 移位
题意分析¶
给定一个正整数 $n$,代表偏移量。我们需要对大写字母表 ABCDEFGHIJKLMNOPQRSTUVWXYZ
进行循环右移,即将每个字母向后移动 $n$ 个位置,超出 Z
的部分从 A
开始继续。
例如:
- 当 $n = 3$,结果为
DEFGHIJKLMNOPQRSTUVWXYZABC
- 当 $n = 26$ 或其倍数,结果为原始字母表不变
解题思路¶
本题本质上是将一个长度为 $26$ 的字符序列进行循环位移操作。
- 我们可以从字符
'A'
到'Z'
构造原始字母表。 - 对于每一个字符,其 ASCII 值可以通过
(char)('A' + i)
构造得到。 - 偏移后的字符应满足循环性质,即偏移后的位置为:
new_char = 'A' + (i + n) % 26;
其中 i
是当前字符相对 'A'
的位置(即原始索引),n
是偏移量。
实现步骤¶
- 读取输入整数 $n$。
- 对偏移量 $n$ 取模 26,得到实际偏移量
k = n % 26
。 - 使用一个循环从
i = 0
到25
:- 对于每个位置
i
,计算偏移后的位置为(i + k) % 26
- 对于每个位置
- 对应的字符为:
'A' + (i + k) % 26
- 将字符依次输出即可。
时间复杂度分析¶
- 时间复杂度:$O(26)$,即常数级别的循环处理,每次输出一个字符。
- 空间复杂度:$O(1)$,仅使用常数个变量,无需额外数据结构。
总结¶
- 本题属于典型的循环位移变换。
- 关键是利用 ASCII 编码将字符与数字进行转换,通过模运算实现循环偏移。
- 在
C++
中,可以通过简单的循环和字符操作高效实现,效率和代码复杂度都非常低。