持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第19天,点击查看活动详情
一、题目描述:
345. 反转字符串中的元音字母 - 力扣(LeetCode)
给你一个字符串 s
,仅反转字符串中的所有元音字母,并返回结果字符串。
元音字母包括 'a'
、'e'
、'i'
、'o'
、'u'
,且可能以大小写两种形式出现。
示例 1:
输入:s = "hello"
输出:"holle"
示例 2:
输入:s = "leetcode"
输出:"leotcede"
提示:
- 1 <= s.length <= 3 * 10^5
- s 由 可打印的 ASCII 字符组成
二、思路分析:
- 循环判断字符串数组元素是否是元音字母之前,要先判断右指针大于0,否则当右指针为0的时候数组访问可能越界,提交代码时会报错
- 向函数传参的时候由于函数定义的形参是指针类型,传参要记得加上取地址符,之前忘了加报错查了半天5555
- switch函数拼错了,写成了swich。。。
- 判断字符是否为元音字母的函数里如果用swich case的话,swich的参数里不能加单引号
三、AC 代码:
void exchange(char*a,char*b)
//定义一个函数,用来交换两个元音字母
{
char c = *a;
*a = *b;
*b = c;
}
int judge(char*a)
//定义一个函数用来判断字符是否为元音字母
{
switch(*a)
//switch这里的*a一定不能用单引号
{
case 'a':return 1;
case 'A':return 1;
case 'e':return 1;
case 'E':return 1;
case 'i':return 1;
case 'I':return 1;
case 'o':return 1;
case 'O':return 1;
case 'u':return 1;
case 'U':return 1;
default:return 0;
}
}
char * reverseVowels(char * s)
{
int left = 0;
int right = strlen(s) - 1;
//定义左右两个指针,left从左往右找,right从右往左找
if(right == 0)
//判断一下极端情况,如果字符数量小于2个,就不用反转了,直接输出吧
{
return s;
}
else if(right > 0)
{
while(left < right)
{
if((judge(&s[left])) == 0)
//如果左指针指向的元素不是元音字母,就把左指针+1
{
++left;
}
else if((judge(&s[right])) == 0)
//如果右指针指向的元素不是元音字母,就把右指针-1
{
--right;
}
else
//如果左右指针指向的元素都是元音字母,就交换一下它们
{
exchange(&s[left],&s[right]);
++left;
--right;
}
}
}
return s;
//最后返回处理好的字符串数组s
}