题目回顾
旺仔哥哥忘记了登录密码,但他记得密码是通过将原文字符串 s
中的每个小写字母向后错位 n
次得到的。字母 z
向后错位一次会变成 a
,以此类推循环。给定错位次数 n
和原文字符串 s
,要求计算出最终的密码字符串。
解题思路
- 字母循环移位:小写字母共有 26 个,从 'a' 到 'z'。当字母向后移动
n
次时,如果超过 'z',则需要循环回到 'a' 继续移动。
例如,'z' 移动 1 次变成 'a','y' 移动 2 次变成 'a'('y' → 'z' → 'a')。
- 计算新字母的位置:对于原文中的每个字符 s[i],其对应的字母序号是 s[i] - 'a'('a' 对应 0,'b' 对应 1,...,'z' 对应 25)。
向后移动 n 次后的新序号为 (s[i] - 'a' + n) % 26。取模 26 是为了处理循环移位的情况。
新字母的 ASCII 码为 (新序号) + 'a',即 (s[i] - 'a' + n) % 26 + 'a'。
- 遍历字符串:对字符串
s
中的每个字符依次进行上述计算,并将结果拼接成最终的密码字符串。
#include<bits/stdc++.h> #define int long long using namespace std; const int N = 1e5+10; const int M = 1e9+7; //下面这个 solve()函数 才是代码有效部分 void solve() { int k; cin>>k; string s; cin>>s; int n = s.size(); for(int i=0;i<n;i++) { //转换为数字 int h =(s[i]-'a'+k)%26; cout<<(char)(h+'a'); } } signed main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); int _ = 1; //cin >> _ ; while(_--) solve(); return 0; }
代码解释
- 输入处理:读取错位次数 k 和原文字符串 s。
- 遍历字符串:对于字符串 s 中的每个字符 s[i]:计算其相对于 'a' 的序号:s[i] - 'a'。
计算向后移动 k 次后的新序号:(s[i] - 'a' + k) % 26。取模 26 确保序号在 0 到 25 之间,实现循环移位。将新序 号转换为对应的字母:(char)(h + 'a'),并直接输出。
复杂度分析
- 时间复杂度:O(|s|),其中 |s| 是字符串的长度。
- 空间复杂度:O(1),