题目描述:
给你两个正整数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 }