剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)

简介: 剑指 Offer 58 - I:翻转单词顺序(c++字符串常用处理方法)

题目

题目链接

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。

示例 1:

输入: "the sky is blue"
输出: "blue is sky the"

示例 2:

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

示例 3:

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

解题

方法一:常规解法

1.strip 删除头尾空格

2.split 以空格划分将字符串加入数组中

3.reverse 翻转

4.join 将数组转化为字符串

class Solution {
public:
    string reverseWords(string s) {
        int n=s.size();
        //strip
        int l=0;
        int r=n-1;
        while(l<=r&&s[l]==' ') l++;
        while(l<=r&&s[r]==' ') r--;
        s=s.substr(l,r-l+1);
        //split
        vector<string> strs;
        string tmp;
        s+=' ';
        for(char c:s){
            if(c==' '){
                if(!tmp.empty()){
                    strs.push_back(tmp);
                    tmp.clear();
                }
            }
            else tmp+=c;
        }
        //reverse
        reverse(strs.begin(),strs.end());
        //join
        string res;
        for(int i=0;i<strs.size();i++){
            if(i==strs.size()-1) res+=strs[i];
            else res+=strs[i]+' ';
        }
        return res;
    }
};

方法二:倒序遍历

倒序遍历,直接遇到一个单词,就加入结果string中。

class Solution {
public:
    string reverseWords(string s) {
        string res;
        int i=s.size()-1;
        // 跳过末尾所有空格
        while(i>=0&&s[i]==' ') i--;
        while(i>=0){
            // 搜索单词并添加
            int r=i;
            while(i>=0&&s[i]!=' ') i--;
            res+=s.substr(i+1,r-i);
            // 跳过所有空格
            while(i>=0&&s[i]==' ') i--;
            // 后续还有单词说明不是头部空格,需要添加(如果是头部,上一步就使得i<0)
            if(i>=0) res+=' ';
        }
        return res;
    }
};


相关文章
|
2月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
81 4
|
1月前
|
缓存 网络协议 API
C/C++ StringToAddress(字符串转 boost::asio::ip::address)
通过上述步骤和示例代码,你可以轻松地在C++项目中实现从字符串到 `boost::asio::ip::address`的转换,从而充分利用Boost.Asio库进行网络编程。
52 0
|
1月前
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
2月前
|
C++
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
|
2月前
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
4月前
|
算法 C++
2730. 找到最长的半重复子字符串(c++,滑动窗口)
2730. 找到最长的半重复子字符串(c++,滑动窗口)
|
4月前
|
C++
567. 字符串的排列(c++)滑动窗口
567. 字符串的排列(c++)滑动窗口
|
4月前
|
编译器 C++
【C++】string类的使用④(字符串操作String operations )
这篇博客探讨了C++ STL中`std::string`的几个关键操作,如`c_str()`和`data()`,它们分别返回指向字符串的const char*指针,前者保证以&#39;\0&#39;结尾,后者不保证。`get_allocator()`返回内存分配器,通常不直接使用。`copy()`函数用于将字符串部分复制到字符数组,不添加&#39;\0&#39;。`find()`和`rfind()`用于向前和向后搜索子串或字符。`npos`是string类中的一个常量,表示找不到匹配项时的返回值。博客通过实例展示了这些函数的用法。
|
5月前
|
C++ 容器
C++字符串string容器(构造、赋值、拼接、查找、替换、比较、存取、插入、删除、子串)
C++字符串string容器(构造、赋值、拼接、查找、替换、比较、存取、插入、删除、子串)
|
5月前
|
编译器 C++
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
【C++进阶】深入STL之string:模拟实现走进C++字符串的世界
38 1