题解 | 凯撒加密
凯撒加密
https://www.nowcoder.com/practice/006b7917d3784371a43cfbae01a9313d
题目回顾
旺仔哥哥忘记了登录密码,但他记得密码是通过将原文字符串 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),
查看19道真题和解析