每日一练之翻转单词顺序列

翻转单词顺序列

OJ地址:翻转单词顺序列
在这里插入图片描述

方法一:单词拆分

首先定义一个存放字符串的vector容器,然后将字符串按空格进行拆分,拆分成一个个单词,将其存放在 vector 容器中,如果遇到空格,也将空格当作一个字符串,存放入容器内,最后将容器中的字符串按照从后往前进行拼接,最后形成了目标字符串

在这里插入图片描述

那么我们怎么拆分单词呢?

  1. 设置一个索引 i ,从头到尾开始遍历字符串,i 指向的是当前正在考察的字符
  2. 我们观察发现,当下标 i 指向的字符不是空格,但是 i+1 指向的字符是空格,那么表示遍历完一个单词,此时我们就可以把该单词放入vector容器内,继续往后遍历
  3. 当 i 下标等于字符串长度 - 1 时,表示遍历完成
	string ReverseSentence(string str) {
        string res = "";
        int i = 0;
        if(str.length() == 0) //如果字符串为空,返回空字符串
            return res;
        while(i < str.length() && str[i] == ' ') //找到字符串第一个非空格字符
        	++i;
        if (i == str.length())  //如果字符串全是空格,返回原字符串
        	return str;
       vector<string> s;
        while(i < str.length())
        {
            string tmp = "";
            //如果是空格,也把空格放进数组中
            while(str[i] == ' ')
            {
                s.push_back(" ");
                i++;
            }
            //不是空格,表示要遍历一个单词了
            while(str[i] != ' ')
            {
                tmp += str[i];
                //当该字符不是空格,但是下一个字符是空格,那么表示该单词结束
                if(str[i + 1] == ' ' || i == str.length() - 1)
                {
                    s.push_back(tmp);
                    i++;
                    break;
                }
                //如果下一个字符不是空格,表示这个单词还未结束,继续遍历
                else
                    i++;
            }
        }
      for(int i = s.size() - 1; i >= 0; i--) //将容器中的字符串按照从后往前进行拼接
      {
          res += s[i];
      }
        return res; 
    }
方法二:滑动窗口

【实现思路】

  1. 我先把字符串整体逆置
  2. 然后利用滑动窗口控制每个单词的左右边界,将每个单词进行逆置
  3. 当遍历完整个字符串,那么整个翻转过程也就完成了

在这里插入图片描述

	void reverse(string &str, int l, int r) //单词翻转
    {
        string tmp = str;
        for(int i = r; i >= l; i--)
            str[r - i + l] = tmp[i];
    }
    string ReverseSentence(string str) {
        reverse(str, 0, str.length()-1); //先整体翻转
        int i, j; //滑动窗口左右边界
        i = j = 0;
        while(j < str.length())
        {
            while(str[j] != ' ' && j < str.length()) 
            {
                j++;
            }
            if(j == str.length())//字符串中没有空格,直接将整个字符串进行翻转
            {
                reverse(str, i, j-1);
                break;
            }
            if(j - i > 1) //对单个单词不用进行翻转
                reverse(str, i, j-1);
            i = j+1; //移动滑动窗口
            j = i+1;
        }
        return str;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值