网易笔试题2021_002
题目描述:
给你两个正整数n,k,其中 1<=n<=26,字符串Sn的形成规则如下:
Li表示26个字母a-z,依次是:
L1 = “a”
L2 = “b”
L3 = “c”
…
L24 = “x”
L25 = “y”
L26 = “z”
S1 = “a” 当i>1时,有Si=Si-1+Li+reverse(invert(Si-1))
其中+表示字符串连接操作,reverse(x)返回反转x后得到的字符串,而invert(x)则会翻转x中的每一位(例如:‘a’翻转为‘z’,‘b’翻转为‘y’,…,而‘z’翻转为‘a’)
例如,符合的上述条件的序列的前4个字符串依次是:
S1 = “a”
S2 = “abz”
S3 = “abzcayz”
S4 = “abzcayzdabzxayz”
请你返回Sn的第k位字符,题目数据保证k一定在Sn长度范围以内。
示例一:
输入:
3 1
输出:
a
说明:
S3 = “abzcayz”,其中第一位为"a"
示例二:
输入:
4 11
输出:
z
解法一:(C++)
#include<iostream>
#include<algorithm>
using namespace std;
string invert(string S)
{
string invertS = S;
int len = invertS.length();
for(int i=0; i<len; i++)
{
invertS[i] = char('a'+'z'-char(invertS[i]));
}
return invertS;
}
string reverse(string S)
{
string reverseS = S;
int len = reverseS.length();
for(int i=0; i<len/2+1; i++)
{
char temp;
temp = reverseS[len-i-1];
reverseS[len-i-1] = reverseS[i];
reverseS[i]=temp;
}
return reverseS;
}
int main()
{
char L[26];
for(int i=0; i<26; i++)
{
L[i] = char('a'+i);
//cout<<L[i]<<endl;
}
int n,k;
cin>>n>>k;
string S[n];
S[0] = L[0];
//cout<<S[0]<<endl;
for(int j=1; j<n; j++)
{
S[j] = S[j-1]+L[j]+(reverse(invert( S[j-1])));
//cout<<S[j]<<endl;
}
cout<<S[n-1][k-1];
return 0;
}