【题解】《算法零基础100讲》(第25讲) 字符串算法(五) - 字符串反转

344. 反转字符串

reverse

看到这道题的名字就一个念头,reverse…

class Solution {
public:
    void reverseString(vector<char>& s) {
        reverse(s.begin(),s.end());
    }
};
双指针

这毕竟不是出题人的念头…那么我们来想想正确的思路
反转一个字符串就是把第一个字符和倒数第一个字符交换,第二个字符和倒数第二个字符交换…依次进行

class Solution {
public:
    void reverseString(vector<char>& s) {
        int i=0,j=s.size()-1;
        while(i<j)
        {
            swap(s[i],s[j]);
            i++,j--;
        }
    }
};

2000. 反转单词前缀

线性枚举+双指针

交换方式和上一道题一样,和上一道题不一样的就是交换的右端点。线性枚举找到所找的位置。

class Solution {
public:
    string reversePrefix(string word, char ch) {
        int l=0,r=-1;
        for(int i=0;i<word.size();i++)
            if(word[i]==ch) 
            {
                r=i;
                break;
            }
        while(l<r)
        {
            swap(word[l],word[r]);
            l++,r--;
        }
        return word;
    }
};

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

线性枚举+双指针

交换的方式还是和第一题相同,只需要线性枚举出所有元音字母的位置存到一个数组中,然后交换时候只交换数组中的下标

class Solution {
public:
    string reverseVowels(string s) {
        vector<int>res;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='a'||s[i]=='e'||s[i]=='i'||s[i]=='o'||s[i]=='u'||s[i]=='A'||s[i]=='E'||s[i]=='I'||s[i]=='O'||s[i]=='U') res.push_back(i);
        }
        int i=0,j=res.size()-1;
        while(i<j)
        {
            swap(s[res[i]],s[res[j]]);
            i++,j--;
        }
        return s;
    }
};

剑指 Offer 58 - I. 翻转单词顺序

线性枚举+双指针

线性枚举找出所有的单词,然后交换他们的位置

class Solution {
public:
    string reverseWords(string s) {
        vector<string>res;
        string ch;
        s+=' ';
        for(int i=0;i<s.size();i++)
        {
            if(s[i]!=' ') ch+=s[i];
            else
            {
                if(ch.size()) res.push_back(ch);
                ch.clear();
            }
        }
        int i=0,j=res.size()-1;
        while(i<j)
        {
            swap(res[i],res[j]);
            i++,j--;
        }
        string ans;
        for(auto t:res) ans+=t+' ';
        return ans.substr(0,ans.size()-1);
    }
};

557. 反转字符串中的单词 III

线性枚举+双指针

给首尾加一个空格减少对首首尾的控制。线性枚举发现他是一个单词以后进行双指针实现的交换操作

class Solution {
public:
    string reverseWords(string s) {
        int l,r;
        s=' '+s+' ';
        for(int i=0;i<s.size();i++)
        {
            if(i!=0&&s[i]==' ')
            {
                l=r+2,r=i-1;
                int g=l,h=r;
                while(g<h)
                {
                    swap(s[g],s[h]);
                    g++,h--;
                }
            } 
            else if(s[i]==' ') l=r=i-1;
            
        }
        return s.substr(1,s.size()-2);
    }
};

541. 反转字符串 II

线性枚举+双指针

枚举到2k的倍数是就反转前k个字符

class Solution {
public:
    string reverseStr(string s, int k) {
        int cnt=0;
        for(int i=0;i<s.size();i++)
        {
            cnt++;
            if(cnt%(2*k)==0)
            {
                int l=cnt-2*k,r=cnt-k-1;
                while(l<r)
                {
                    swap(s[l],s[r]);
                    l++,r--;
                }
            }
        }
        if(s.size()%(2*k))
        {
            int g=s.size()/(2*k)*2*k;
            if(s.size()-g<k)
            {
                int l=g,r=s.size()-1;
                while(l<r)
                {
                    swap(s[l],s[r]);
                    l++,r--;
                }
            }
            else 
            {
                int l=g,r=g+k-1;
                while(l<r)
                {
                    swap(s[l],s[r]);
                    l++,r--;
                }
            }
        }
        return s;
    }
};

917. 仅仅反转字母

线性枚举+双指针

线性枚举分开是字母和不是字母的部分,反转是字母的部分,然后在应该不是字母添加符号

class Solution {
public:
    string reverseOnlyLetters(string s) {
        int cnt=0,flag=0,g=0,st=0;
        string ch,ans;
        vector<int>res,fu;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z') cnt++,ch+=s[i];
            else 
            {
                res.push_back(cnt);
                fu.push_back(s[i]);
                cnt=0;
            }
        }
        int l=0,r=ch.size()-1;
        while(l<r)
        {
            swap(ch[l],ch[r]);
            l++,r--;
        }
        res.push_back(0x3f3f3f3f);
        for(int i=0;i<ch.size();i++)
        {
            while(g==res[flag]) 
            {
                if(flag<res.size()-1) flag++;
                ans+=fu[st++]; 
                g=0;
            }
            ans+=ch[i];
            g++;
        }
        for(int i=st;i<fu.size();i++) ans+=fu[i];
        return ans;
    }
};

7. 整数反转

取数位

直接把整数的每一位取出来,从后往前加入数组中,然后求出现在数组表示的数

class Solution {
public:
    int reverse(int x) {
        int k=1;
        long res=x;
        if(res<0) res=-res,k=-1;
        vector<int>num;
        while(res)
        {
            int t=res%10;
            num.push_back(t);
            res/=10;
        }
        long ans=0;
        for(int i=0;i<num.size();i++)
        {
            ans=ans*10+num[i];
        }
        if(ans<=((1ll<<31)-1)&&ans>=-(1ll<<31))return ans*k;
        return 0;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Leetcode算法小抄是一份权威的算法手册,包含了Leetcode上常见的算法题目的解法和详细解。这个小抄对于想要提升自己算法能力的程序员来说非常有用。该小抄包括以下内容: 1.基础数据结构:包括数组、链表、栈、队列、树、哈希表等。 2.算法基础:包括排序算法、搜索算法、贪心算法、动态规划等。 3.高级算法:包括图论、字符串匹配、线性代数、计算几何等。 每个算法题目都附有详细的解析和代码实现,方便程序员进行学习和练习。此外,该小抄还提供了优秀的算法实现其他程序员的思路和解答,这对于新手来说尤为重要。 总之,Leetcode算法小抄是一份非常实用的算法手册,如果你想成为一名出色的程序员,学习和掌握其中的内容必不可少。 ### 回答2: LeetCode算法小抄是一份非常实用的算法指南,它包含了大量的算法问题和解答,而且所有的算法问题都是以LeetCode网站上的题目为蓝本的。这个小抄主要面向准备参加Google、Facebook、 Apple等知名科技公司的笔试或者面试的程序员,也适用于想要提高自己算法能力的人。这份小抄的编制者是Steven Halim和Felix Halim,也就是ACM竞赛的著名选手和教练。他们将自己多年的ACM竞赛经验倾囊相授,帮助大家提高算法能力。小抄中包含了高频出现的数据结构和算法,如树、图、排序、数组、动态规划等,每个算法都有详细的解释和代码实现。此外,小抄还包含了一些实用技巧,如测试用例设计、代码调试、复杂度分析等。总之,LeetCode算法小抄是一份非常实用、全面的算法指南,如果你想要提高自己的算法能力,相信它一定能为你带来帮助。 ### 回答3: LeetCode算法小抄是一个常用的算法学习工具,它主要是为了帮助程序员更加高效地学习和掌握LeetCode算法。LeetCode算法小抄中收录了大量经典的算法题目,并提供了详细的题解和代码示例,涵盖了各种数据结构、算法和编程技术。 LeetCode算法小抄的优点在于它的简便性和针对性。其内容结构清晰,难度逐渐增加,让读者能够逐步学习并掌握更加复杂的数据结构和算法。同时,小抄中提供了大量的代码示例和优化方法,可以帮助读者更加深入地理解和掌握算法。 另外,LeetCode算法小抄还提供了各种算法题目的分类、标签和解法推荐,让读者能够更加容易地找到自己需要的题目和解法。同时,小抄中还提供了一些常见的面试题目和解题思路,可以帮助读者更好地应对工作中和面试中的挑战。 总之,LeetCode算法小抄是一本非常实用的算法学习工具,它可以帮助程序员更加高效地学习和掌握算法知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学习算法的小菜鸡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值