344.Reverse String
Write a function that takes a string as input and returns the string reversed.
Example:
Given s = “hello”, return “olleh”.
题意:给出字符串,将其反转,写出这样的函数。函数定义如下:
char* reverseString(char* s) {
}
此题是典型的双指针算法的应用,首尾各放置一个指针,由两头向中间遍历,将最后一位到第一位的各个字符放进新数组即可。
此处需要注意的是,由于函数返回的是一个指针类型,如果我们直接将函数内部声明的新数组返回,程序将出现错误,因为指针作为局部变量,在函数返回之后就会消失,此时主程序便无法获得正确的结果,所以我们要用strcpy函数将字符串复制进参数中的字符串s中去。
思路就是这样,代码如下:
char* reverseString(char* s) {
int sl=strlen(s);
char r[sl+1];/*+1以容纳字符串结尾的'\0'*/
int i;
for(i=0;i<sl;i++){
r[sl-i-1]=*(s+i);
}
r[i]='\0';
strcpy(s,r);
return s;
}
345.Reverse Vowels of a String
Write a function that takes a string as input and reverse only the vowels of a string.
Example 1:
Given s = “hello”, return “holle”.
Example 2:
Given s = “leetcode”, return “leotcede”.
题目大意:将一个字符串中的元音字母倒序排列,其余字母顺序不变,具体请见Example,函数定义如下:
char* reverseVowels(char* s) {
}
还是双指针问题,声明两个指针itfwd和itbwd,分别指向首尾。当itfwd小于itbwd时,进行循环,如果两个指针都指向元音字母,那么两个字母交换位置。如果一个指向元音一个为辅音,则将指向辅音的指针向前或向后移动,直到都指向元音进行交换。
后来又想了想,感觉有优化的空间,如果判断出这个字符串里的元音字母少于两个,则直接返回原字符串即可,省去了一些判断。代码如下:
int isVowel(char c){/*用于判断是否为元音字母*/
return
c == 'a' || c == 'A' ||
c == 'e' || c == 'E' ||
c == 'i' || c == 'I' ||
c == 'o' || c == 'O' ||
c == 'u' || c == 'U';
}
/*定义交换函数*/
void charswp(char *a,char *b){
char tmp=*a;
*a=*b;
*b=tmp;
}
char* reverseVowels(char* s) {
int len=strlen(s);
if(len<2)
return s;
int itfwd=0,itbwd=len-1;
while(itfwd<itbwd){
if(isVowel(s[itfwd])&&isVowel(s[itbwd])){
charswp(&s[itfwd],&s[itbwd]);
++itfwd;
--itbwd;
}
while(!isVowel(s[itfwd])&&itfwd<=len-1)
++itfwd;
while(!isVowel(s[itbwd])&&itbwd>=0)
--itbwd;
}
return s;
}
持续更新中……