题目描述
有一个字符串,每次将它复制且将最后一位移到最前面,这样一直重复,求第N 个字符。
解析
首先看到题目,如果这样重复,就只需要复制到长度大于N 就行。
直接循环不太好做,但是我们可以发现这整个字符串如果分成两个区间他们之间就有关系。
既然是复制然后将最后移到前面,我们就可以发现从第二个开始,每个字符串的编号都是原来加一,而第一个则是最后一个,原来的就是复制前的,可以采用折半的方法。
这样就可以一直缩小它的范围,最终得到一个答案。
![](https://i-blog.csdnimg.cn/blog_migrate/c2e1b863be5dde6f281038fa53c3818d.jpeg)
时间复杂度:O(log)
代码
#include<bits/stdc++.h>
using namespace std;
char s[35];
long long n;
long long len,lenk;
char digui(long long l,long long r,long long L,long long R,long long pos){
if(pos<=lenk){
return s[pos];
}
if(pos<=r){
return digui(l,r/2,r/2+1,r,pos);
}else{
if(pos==L){
return digui(l,r/2,r/2+1,r,r);
}else{
return digui(l,r/2,r/2+1,r,pos-L);
}
}
}
int main(){
cin>>s+1>>n;
len=strlen(s+1);
lenk=len;
while(len<n){
len*=2;
}
cout<<digui(1,len/2,len/2+1,len,n);
return 0;
}