方法一:创建一个数组保存所有元音字符下标,然后交换,时间复杂度O(n),费内存
char* reverseVowels(char* s) {
int len = strlen(s);
int j = 0;
int *subcript = (int*)malloc(len*sizeof(int));
for (int i = 0; i < len; i++){
switch (s[i]) {
case 'a':
case 'i':
case 'o':
case 'e':
case 'u':
case 'A':
case 'I':
case 'O':
case 'E':
case 'U':
subcript[j++] = i;
break;
default:
break;
}
}
for (int i = 0; i < (j>>1); i++){
s[subcript[i]] ^= s[subcript[j-1-i]];
s[subcript[j - 1 - i]] ^= s[subcript[i]];
s[subcript[i]] ^= s[subcript[j - 1 - i]];
}
free(subcript);
return s;
}
方法二 双指针法
int is_vowel(char _s)
{
printf("_s = %c\r\n",_s);
switch (_s) {
case 'a':
case 'i':
case 'o':
case 'e':
case 'u':
case 'A':
case 'I':
case 'O':
case 'E':
case 'U':
return 0;
break;
default:
break;
}
return 1;
}
char* reverseVowels(char* s) {
int i = 0;
int j = strlen(s);
j--;
while (i < j){
while ((i < j) && (1 == is_vowel(s[i]))) {
i++;
}
while ((i < j) && (1 == is_vowel(s[j]))) {
j--;
}
if (i >= j) {
break;
}
s[i] ^= s[j];
s[j] ^= s[i];
s[i] ^= s[j];
i++;
j--;
}
return s;
}