LintCode 927: Reverse Words in a String

本文深入探讨了如何使用C++实现字符串的单词反转,重点讲解了string.find()方法的应用,通过实例展示了如何在不分配额外空间的情况下,按单词逆序排列字符串。

题目如下:
927. Reverse Words in a String II
Given an input character array, reverse the array word by word. A word is defined as a sequence of non-space characters.

The input character array does not contain leading or trailing spaces and the words are always separated by a single space.

Example
Given s = “the sky is blue”,
after reversing : “blue is sky the”

Challenge
Could you do it in-place without allocating extra space?

这题主要考string.find()的用法。
注意string.find(’ ', endPos+1)里面的endPos+1可以表示从什么地方开始找。

class Solution {
public:
    /**
     * @param str: a string
     * @return: return a string
     */
    string reverseWords(string &str) {
        string result;
        int startPos = -1, endPos = 0;
        size_t len = str.size();
        
        while (endPos < len) {
  
            endPos = str.find(' ', endPos + 1);
            if (startPos >= 0)
                result = str.substr(startPos + 1, endPos - startPos - 1) + ' ' + result;
            else 
                result = str.substr(startPos + 1, endPos);

            startPos = endPos;
        }
        return result;
    }
};
下载前必看:https://pan.quark.cn/s/a4b39357ea24 在本资料中,将阐述如何运用JavaScript达成单击下拉列表框选定选项后即时转向对应页面的功能。 此种技术适用于网页布局中用户需迅速选取并转向不同页面的情形,诸如网站导航栏或内容目录等场景。 达成此功能,能够显著改善用户交互体验,精简用户的操作流程。 我们须熟悉HTML里的`<select>`组件,该组件用于构建一个选择列表。 用户可从中选定一项,并可引发一个事件来响应用户的这一选择动作。 在本次实例中,我们借助`onchange`事件监听器来实现当用户在下拉列表框中选定某个选项时,页面能自动转向该选项关联的链接地址。 JavaScript里的`window.location`属性旨在获取或设定浏览器当前载入页面的网址,通过变更该属性的值,能够实现页面的转向。 在本次实例的实现方案里,运用了`eval()`函数来动态执行字符串表达式,这在现代的JavaScript开发实践中通常不被推荐使用,因为它可能诱发安全问题及难以排错的错误。 然而,为了本例的简化展示,我们暂时搁置这一问题,因为在更复杂的实际应用中,可选用其他方法,例如ES6中的模板字符串或其他函数来安全地构建和执行字符串。 具体到本例的代码实现,`MM_jumpMenu`函数负责处理转向逻辑。 它接收三个参数:`targ`、`selObj`和`restore`。 其中`targ`代表要转向的页面,`selObj`是触发事件的下拉列表框对象,`restore`是标志位,用以指示是否需在转向后将下拉列表框的选项恢复至默认的提示项。 函数的实现通过获取`selObj`中当前选定的`selectedIndex`对应的`value`属性值,并将其赋予`...
<think>好的,我现在要帮用户解答关于C++中std::string reverse(){}中string的作用的问题。首先,我需要理解用户的问题到底是什么。用户可能看到类似reverse()的成员函数,想知道string在这里的作用是什么,或者可能对函数定义中的参数或返回类型有疑问。 首先,我得确认用户提到的reverse()是否确实是std::string的成员函数。根据我的知识,标准库中的std::string并没有reverse()这个成员函数。通常,反转字符串可以通过标准算法库中的std::reverse来实现,比如std::reverse(str.begin(), str.end())。所以用户可能在代码中看到的是一个自定义的成员函数,或者误解了标准库的功能。 接下来,用户提到的函数定义是std::string reverse(){},这看起来像是用户自己定义的一个函数,返回类型是std::string,函数名是reverse,参数可能为空。这时候,string的作用是作为返回值类型,表示这个函数会返回一个字符串对象。 我需要解释std::string在这里作为返回类型的意义,以及可能作为参数的情况。同时,需要指出标准库中没有这个成员函数,避免用户混淆。另外,用户可能想了解如何正确实现反转字符串的功能,所以需要提及标准库中的std::reverse用法。 可能用户是在学习如何为自定义的字符串类添加reverse方法,或者在阅读某个代码示例时遇到了这样的结构。需要明确说明std::string是标准库中的字符串类,reverse()如果是成员函数的话,通常需要自己定义,并解释其作用。 还要考虑到用户可能的误区,比如认为std::string自带reverse方法,这时候需要纠正,并指导正确的方法。同时,举例说明如何正确使用std::reverse来反转字符串,以及自定义reverse函数的方法,如果有必要的话。 最后,确保回答清晰,结构合理,使用用户容易理解的语言,避免过多技术术语,但又要准确无误。可能需要分点说明,比如函数声明中的string作为返回类型,作为参数的情况,以及标准库中的正确用法等。</think>在C++中,`std::string reverse(){}`这个函数声明里的`string`有双重作用: ### 一、语法层面解析 $$ \text{std::string} \quad \xrightarrow{\text{返回类型}} \quad \text{reverse()} \quad \xrightarrow{\text{函数名}} \quad \{\} $$ 1. **作为返回类型**:表示该函数将返回一个`std::string`对象 2. **作为参数容器**:隐含该函数操作的是字符串数据(需结合具体实现) ### 二、实际应用场景 #### 场景1:自定义字符串逆序函数 ```cpp #include <string> #include <algorithm> // 需要包含算法库 std::string reverse(std::string str) { std::reverse(str.begin(), str.end()); // 调用标准库算法 return str; } // 调用示例:std::string s = reverse("hello"); ``` #### 场景2:类成员函数(错误示例) ```cpp class MyString { public: std::string reverse() { // 正确用法:作为成员函数 std::reverse(data.begin(), data.end()); return data; } private: std::string data; }; ``` ### 三、标准库对照 - 标准库中**没有**`std::string::reverse()`成员函数 - 正确做法是使用泛型算法: ```cpp std::string s = "hello"; std::reverse(s.begin(), s.end()); // s变为"olleh" ``` ### 四、关键区别表 | 代码形式 | 性质 | 是否标准库支持 | 典型用法 | |----------------------|------------|----------------|--------------------------| | `std::string func()` | 返回类型 | 通用语法 | 函数返回字符串对象 | | `s.reverse()` | 成员函数 | 需自定义 | 面向对象风格字符串操作 | | `std::reverse()` | 算法函数 | 标准库提供 | 泛型容器元素逆序 | 建议:需要字符串逆序时,优先使用`std::reverse(begin, end)`+迭代器的方式,既标准又高效。自定义`reverse()`函数时,注意参数和返回类型的`std::string`声明是必要的类型约束。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值