• Leetcode 345. 反转字符串中的元音字母


    1.题目描述

    编写一个函数,以字符串作为输入,反转该字符串中的元音字母。

    示例 1:

    输入: "hello"
    输出: "holle"

    示例 2:

    输入: "leetcode"
    输出: "leotcede"

    说明:
    元音字母不包含字母"y"。

    2.思路一:单向遍历,找出元音

    Leetcode提交运行时间8ms.

    class Solution {
    public:
        string reverseVowels(string s) {
            int size = s.size();
            //直接返回
            if(size==0 || size==1) return s;
            
            //遍历,找出元音字母,保存下标
            for(int i=0; i<size; ++i){
                if(isVowel(s[i]))
                    idx.push_back(i);
            }
            
            //存在元音字母,反转
            if(idx.size()!=0)
               reverse(s,0,idx.size()-1);
            
            return s;
        }
        
        //反转函数
        void reverse(string& s, int begin, int end){
            for(int m=begin; m<=(begin+end)/2; ++m)
                swap(s[idx[m]],s[idx[begin+end-m]]);
        }
        
        //判断元音函数
        bool isVowel(char v){
    //大写与小写
    if(v=='a'||v=='i'||v=='o'||v=='u'||v=='e'||v=='A'||v=='I'||v=='O'||v=='U'||v=='E') return true; else return false; } private: vector<int> idx; };

    3.思路二:两端从中间遍历,找到立即交换

    3.1 下标访问string

    class Solution{
    public:
        string reverseVowels(string s){
            int sz = s.size();
            for(int i=0, j=sz-1; i<j; ++i,--j){
                while(i<j && !isVowel(s[i]))
                    ++i;
                while(i<j && !isVowel(s[j]))
                    --j;
                swap(s[i],s[j]);
            }
            return s;
        }
        bool isVowel(char v){
            return v=='a'||v=='i'||v=='o'||v=='u'||v=='e'||
            v=='A'||v=='I'||v=='O'||v=='U'||v=='E';
        }
    
    }

    3.2 迭代器访问string

    class Solution {
    public:
        string reverseVowels(string s) {
            int sz = s.size();
            //直接返回
            if(sz==0 || sz==1) return s;
            
            auto beg = s.begin(), end = s.end()-1;
            while(beg < end){
                //内部while必须再次判断beg<end
                while(beg<end && !isVowel(*beg))
                    ++beg;
               //内部while必须再次判断beg<end
                while(beg<end && !isVowel(*end))
                    --end;
              
                swap(*beg,*end);
                ++beg;
                --end;            
                }
            return s;
        }
        
        bool isVowel(char v){
            return v=='a'||v=='i'||v=='o'||v=='u'||v=='e'||
                v=='A'||v=='I'||v=='O'||v=='U'||v=='E';
        }
    
    };
    • 内部while必须再次判断beg<end,举一个反例?
  • 相关阅读:
    毕业设计-角色用户管理
    质因数分解
    高次同余方程
    线性同余方程
    乘法逆元
    约数,整除
    扩展欧几里得算法
    同余
    P2303 [SDOI2012] Longge 的问题
    最大公约数(gcd)与最小公倍数(lcm)
  • 原文地址:https://www.cnblogs.com/paulprayer/p/10132306.html
Copyright © 2020-2023  润新知