题目回顾

旺仔哥哥忘记了登录密码,但他记得密码是通过将原文字符串 s 中的每个小写字母向后错位 n 次得到的。字母 z 向后错位一次会变成 a,以此类推循环。给定错位次数 n 和原文字符串 s,要求计算出最终的密码字符串。

解题思路

  1. ​字母循环移位​​:小写字母共有 26 个,从 'a' 到 'z'。当字母向后移动 n 次时,如果超过 'z',则需要循环回到 'a' 继续移动。

例如,'z' 移动 1 次变成 'a','y' 移动 2 次变成 'a'('y' → 'z' → 'a')。

  1. ​计算新字母的位置​​:对于原文中的每个字符 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'。

  1. ​遍历字符串​​:对字符串 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;
 } 

代码解释

  1. ​输入处理​​:读取错位次数 k 和原文字符串 s。
  2. ​遍历字符串​​:对于字符串 s 中的每个字符 s[i]:计算其相对于 'a' 的序号:s[i] - 'a'。

计算向后移动 k 次后的新序号:(s[i] - 'a' + k) % 26。取模 26 确保序号在 0 到 25 之间,实现循环移位。将新序 号转换为对应的字母:(char)(h + 'a'),并直接输出。

复杂度分析

  • ​时间复杂度​​:O(|s|),其中 |s| 是字符串的长度。
  • ​空间复杂度​​:O(1),