反转字符串 II-C语言力扣时间空间开销最忧算法
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = “abcdefg”, k = 2
输出:“bacdfeg”
示例 2:
输入:s = “abcd”, k = 2
输出:“bacd”
对于这一题,博主在力扣做出了最优的算法
时间和空间几乎都是最优的效率
采用线性方法,时间消耗为o(n),且空间消耗也为o(1),代码如下:
void f(char *s ,int i,int j){
char ch;
while(i<j){
ch=s[i];
s[i]=s[j-1];
s[j-1]=ch;
i++;
j--;
}
}
char * reverseStr(char * s, int k){
int i=0;
int m=0;
int len =0;
int n;
while(s[i++]!='\0');
len=i-1;
if(k==0||len==1) return s;
if(k>=len){
f(s,0,len);
return s;}
n=len/k;
for(i=0;m<n;i=i+k*2){
m++;
if(i>len) return s;
if(i+k>len)f(s,i,len);
else f(s,i,i+k);
}
printf("%d ",n);
return s;
}