代码随想录算法训练营day9

1.反转字符串中的单词

1.1 题目

. - 力扣(LeetCode)

1.2 题解

首先将输入的字符串去除前面和后面的空格,注意单词之间的空格要保留,之后再对整个字符串翻转,之后再对每个单词进行翻转。

class Solution {
public:
    string reverseWords(string s)
    {
        //首先删除多余空格
        moveExtraSpace(s);

        //反转整个字符串
        reverseStr(0,s.size()-1,s);

        int temp = 0;
        //再将每个单词翻转过来
        for (int i = 0; i <= s.size(); i++)
        {
            //到达字符串末尾或者单词末尾
            if (i==s.size() || s[i] == ' ')
            {
                reverseStr(temp, i - 1, s);
                temp = i+1;
            }
        }
        return s;
    }
    /// <summary>
    /// 反转没有空格的字符串
    /// </summary>
    /// <param name="s"></param>
    /// <returns></returns>
    void reverseStr(int left,int right,string& s)
    {
;
        while (left < right)
        {
            swap(s[left++], s[right--]);
        }

    }
    /// <summary>
    /// 删除输入字符串中多余的空格
    /// </summary>
    /// <param name="s"></param>
    void moveExtraSpace(string& s)
    {
        //定义快慢指针
        int slow = 0, fast = 0;
        for (; fast < s.size(); fast++)
        {
            if (s[fast] != ' ') 
            {
                //slow!=0表示当前不是字符串开头
                if (slow!=0)
                {
                    //手动加一个空格
                    s[slow++] = ' ';
                }
                //补上单词
                while (fast < s.size() && s[fast] != ' ')
                {
                    s[slow++] = s[fast++];
                }
            }
        }
        s.resize(slow);
    }
};

2.右旋转字符串

2.1 题目

55. 右旋字符串(第八期模拟笔试)

2.2 题解

using namespace std;
#include<iostream>
#include<string>
#include<algorithm>


int main()
{
    //输入的正整数
    int k;
    //输入的字符串
    string s;
    cin >> k >> s;

    //先将字符串全部反转
    reverse(s.begin(), s.end());
    //再将前k个字母反转
    reverse(s.begin(), s.begin() + k);
    //再将后面的字符串反转
    reverse(s.begin()+k, s.end());
    cout<<s<<endl;


}

先将字符串全部反转,再分别反转前k个和后length-k个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值