题目描述:

给你两个正整数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++)

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 string invert(string S)
 6 {
 7     string invertS = S;
 8     int len = invertS.length();
 9     for(int i=0;i<len;i++)
10     {
11         invertS[i] = char('a'+'z'-char(invertS[i]));
12     }
13     return invertS;
14 }
15 
16 string reverse(string S)
17 {
18     string reverseS = S;
19     int len = reverseS.length();
20     for(int i=0;i<len/2+1;i++)
21     {
22         char temp;
23         temp = reverseS[len-i-1];
24         reverseS[len-i-1] = reverseS[i];
25         reverseS[i]=temp;
26     }
27     return reverseS;
28 }
29 
30 int main()
31 {
32     char L[26];
33     for(int i=0;i<26;i++)
34     {
35         L[i] = char('a'+i);
36         //cout<<L[i]<<endl;
37     }
38 
39     int n,k;
40     cin>>n>>k;
41     string S[n];
42     S[0] = L[0];
43     //cout<<S[0]<<endl;
44     for(int j=1;j<n;j++)
45     {
46         S[j] = S[j-1]+L[j]+(reverse(invert( S[j-1])));
47         //cout<<S[j]<<endl;
48     }
49 
50     cout<<S[n-1][k-1];
51     return 0;
52 }