一,第一类的字符串反转问题,也就是输入This is a string.,输出为.gnirts a si sihT,整个字符串反转:
void reverse1(char *a){
int len=strlen(a)-1;
int i=0;
while(i<len){
char ch=a[i];
a[i++]=a[len];
a[len--]=ch;
}
}
#include<stdio.h>
#include<string.h>
int main(){
char a[]="this is a string";
reverse1(a);
printf("%s\n",a);
return 0;
}
二,将字符串指定位置之前的字串反转到尾部,如a[]={‘1’,’2’,’3’,’4’,’5’,’6’,’7’},n=3,反转后a’[]={‘4’,’5’,’6’,’7’,’1’,’2’,’3’},类似leetcode上的Rotate Array。
网上看到这种算法,觉得很巧妙,类比于矩阵BA=(A^TB^T)^T(A^T表示A的逆序)
void reverse2(char *a,int s,int e){
while(s<e){
char ch=a[s];
a[s++]=a[e];
a[e--]=ch;
}
}
#include<stdio.h>
int main(){
char a[]={'1','2','3','4','5,'6','7'};
int n;
scanf("%d",&n);
reverse2(a,0,n-1); //类似于A(字符串下标0到n-1)的逆序。
reverse2(a,n,strlen(a)-1);
reverse2(a,0,strlen(a)-1);
printf("%s\n",a);
}
三,对于This is a string,最终反转成string a is This。网上说的用栈实现,不太会。想法先把整个字符串反转,再逐个单词进行反转。
#include<stdio.h>
#include<string.h>
void reverse3(char *a,int s,int e){
while(s<e){
char ch =a[s];
a[s++]=a[e];
a[e--]=ch;
}
}
char *reversal(char *a){ //char*,返回反转字符串后的指针
int s=0;
int e=0;
reverse3(a,0,strlen(a)-1); //将整个串反转
for(int i=0;i<=strlen(a);i++){
if(a[i]==' '||a[i]=='\0'){
e=i-1;
reverse3(a,s,e);
s=i+1;
}
}//逐个遍历,遇到单词就反转。
return a;
}
int main(){
char a[]="this is a string";
printf("%s",reversal(a));
return 0;
}