leetcode笔记之[345. 反转字符串中的元音字母 ]

19 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 字符组成

二、思路分析:

  1. 循环判断字符串数组元素是否是元音字母之前,要先判断右指针大于0,否则当右指针为0的时候数组访问可能越界,提交代码时会报错
  2. 向函数传参的时候由于函数定义的形参是指针类型,传参要记得加上取地址符,之前忘了加报错查了半天5555
  3. switch函数拼错了,写成了swich。。。
  4. 判断字符是否为元音字母的函数里如果用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
}