代码随想录算法训练营29期Day8|LeetCode 344,541,151,卡码网 54,55

   文档讲解:代码随想录

344.反转字符串

题目链接:https://leetcode.cn/problems/reverse-string/

思路:

       本题目很简单,我们很容易就能发现,所谓的反转其实就是指定位置的两个字符互相交换,因此我们开一个char类型的变量当中间值即可。枚举前一半字符,和后一半互换,就完成了。

核心代码:

class Solution {
public:
    void reverseString(vector& s) {
        int n=s.size();
        char t;
        for(int i=0;i

541.反转字符串II

题目链接:https://leetcode.cn/problems/reverse-string-ii/

思路:

       本题目是上一道题目的进阶。怎么反转字符串我们已经在LeetCode344题学会了,所以这道题的关键不在于反转,在于需要反转哪一段。

        题目告诉我们,每统计2k个字符,就对这2k个字符的前k个进行反转,那我们老老实实统计即可。我们开一个cnt变量进行统计,每输入一个字符cnt自增一,当cnt等于2k时,我们可根据当前统计到的字符串的下标,确定前k个字符的起始下标和结束下标,再根据344题的反转方式反转即可。反转完了接着统计,重复上述操作。

        不要忘记最后的时候处理下最终长度没达到2k的那段字符,对其单独反转一下即可。

核心代码:

class Solution {
public:
    string reverseStr(string s, int k) {
        int n=s.length();
        int cnt=0,i=0;
        while(i>1;
                char t;
                for(int j=l;j<=mid;j++){
                    t=s[j];
                    s[j]=s[r-j+l];
                    s[r-j+l]=t;
                }
                cnt=0;
            }
            i++;
        }
        if(cnt<=k){
            int l=n-cnt,r=n-1,mid=(l+r)>>1;
            char t;
            for(int i=l;i<=mid;i++){
                t=s[i];
                s[i]=s[r-i+l];
                s[r-i+l]=t;
            }
        }
        else{
            cnt-=k;
            int l=n-cnt-k,r=n-1-cnt,mid=(l+r)>>1;
            char t;
            for(int i=l;i<=mid;i++){
                t=s[i];
                s[i]=s[r-i+l];
                s[r-i+l]=t;
            }
        }
        return s;
    }
};

151.翻转字符串里的单词

题目链接:https://leetcode.cn/problems/reverse-words-in-a-string/

思路:

       这道题其实也简单,我们首先能够意识到这个字符串里就只有两种东西:单词和空格,其中单词之间用空格隔开。

       我们可以开一个字符串变量t专门来统计单词,在读入题目给出的字符串时。如果当前字符不为空格,那就将这个字符加入到单词中,如果当前字符为空格,那么说明当前单词读入结束,需要将其加入到答案字符串中。

        注意多个空格的情况,我们需要忽略多个空格,只保留一个空格。同时也要忽略前导和后置空格。

        注意单词字符串在加入到答案字符串时,需要从答案字符串的开头加入,这样就是完成了翻转操作。

核心代码:

class Solution {
public:
    string reverseWords(string s) {
        int n=s.length();
        string ans,t;
        ans="";t="";
        for(int i=0;i

卡码网54.替换数字

题目链接:https://kamacoder.com/problempage.php?pid=1064

思路:

       ACM模式下的题目其实都可以取巧,因为并不需要我们对实际的变量产生什么操作或者改变,它只要求我们对指定的输入能够输出正确的结果就可以了。

        因此这道题目非常简单,我们读入字符串s后立即输出,按照字符来输出:如果当前字符不为数字就输出当前字符,如果当前字符为数字就输出字符串"number"即可。

核心代码:

#include
#include
#include
#include
using namespace std;
string s;
int n;
int main(){
    cin>>s;
    n=s.length();
    for(int i=0;i='0'&&s[i]<='9') printf("number");
        else cout<

 卡码网55.右旋字符串

题目链接:https://kamacoder.com/problempage.php?pid=1065

思路:

       这道题目实际上就是要求我们将字符串s的后k个字符挪到字符串的开头去。

       正如我上一道题目所说,我们实际上并不需要真的将s的结构进行改变。我们只需要先输出s的后k个字符,再输出前n-k个字符就可以了,我们并没有进行实际的挪移,但在输出的结果上来看,我们确实挪移了。

核心代码:

#include
#include
using namespace std;
string s;
int k,n;
int main(){
    cin>>k>>s;
    n=s.length();
    for(int i=n-k;i

今日总结

        今日学习时长2h,今天题都很简单,我也非常熟悉ACM模式,因为搞过竞赛,所以不管取没取巧很容易都过了。

        今天依旧写的简单些,依旧要忙着期末报告,思路都会简写。

你可能感兴趣的:(算法,leetcode,c++)