字符串02

 1.力扣151.翻转字符串里的单词

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

思路:

1.将整个字符串中多余的空格去除

2.再将整个字符串进行反转

3.最后对各个单词进行反转

代码:

#include <bits/stdc++.h>
using namespace std;
/*
 * 思路:
 * 1.先去掉多余的空格
 * 2.将整个字符串反转
 * 3.再将单词反转
 */
//去除空格的函数
void removeExtraSpaces(string& s){
    int slow=0;//慢指针
    for (int fast = 0; fast <s.size() ; ++fast) {
        if (s[fast]!=' '){
            //处理非首空格的空格,多留一个空格好分隔两个单词
            if (slow!=0){
                s[slow++]=' ';
            }
            //如果快指针指的位置不是空格即一个单词的首字母就把快指针的值给慢指针
            while(fast<s.size() && s[fast]!=' '){
                s[slow++]=s[fast++];
            }
        }
    }
    s.resize(slow);//最后字符串的长度就是slow
}

void Reverse(string &s,int left,int right){
    while(left<=right){
        swap(s[left],s[right]);
        left++;
        right--;
    }
}

string reverseWords(string s){
    //1.去除多余的空格
    removeExtraSpaces(s);
    //2.反转整个字符串
    Reverse(s,0,s.size()-1);
    //3.反转单词
    int start=0;//单词起始位置
    //i <= s.size()能等于的原因,因为需要字符串结束的地方有一个判断说明字符串已经结束并且要跟前面的单词结尾是空格的判断保持一致
    for (int i = 0; i <= s.size(); ++i) {
        if (s[i]==' '|| i==s.size()){
            Reverse(s,start,i-1);
            start=i+1;
        }
    }
    return {s};
}


int main() {
    string a=" hello world ";
    cout<<'{'<<reverseWords(a)<<'}';
    return 0;
}

2.右旋字符串:

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入:输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出:输出共一行,为进行了右旋转操作后的字符串。

思路:

1.首先整体反转

2.对前一段反转

3.对后一段反转

代码:

#include <bits/stdc++.h>
using namespace std;

string rightReserve(string s,int n){
    //整体反转
    reverse(s.begin(),s.end());
    //第一段反转
    reverse(s.begin(),s.begin()+n);
    //反转第二段
    reverse(s.begin()+n,s.end());
    return s;
}

int main() {
    string a="abcdefg";
    int n=2;
    cout<<rightReserve(a,n);
    return 0;
}

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值