翻转字符串里的单词(方法一:利用额外空间,方法二:原地翻转,空间复杂度O1):花了好长时间调试第二种方法。

题目:

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

示例 1:

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

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

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

说明:

无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
 

进阶:

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

分析:

  1. 方法一:比较容易想出来,定义两个string变量,temp和ret,temp用来存储不包含空格的临时元素,遇到空格或到达数组末尾,将temp与ret合并;难点是对于逻辑的判断代码1
  2. 方法二:希望通过O1空间实现原地翻转,所以不能借助临时的string变量;
    将s先进行整体翻转,之后将首尾多余空格删除,使用首尾指针记录当前窗口位置,对整个数组进行遍历(更新窗口),遇到空格便将之前的窗口进行翻转;见代码2

代码1:ac
在这里插入图片描述

class Solution {
public:
    string reverseWords(string s) {
        int m = s.size(), i = 0;
        string temp = "", ret = "";
        for(int i = 0; i < m; i++)
        {
            if(s[i] != ' '){
                temp+= s[i];
            }
            if( s[i] == ' ' && temp.size() != 0 ){
                if(ret.size() != 0){
                    temp +=" ";
                }
                ret = temp + ret;
                temp = "";
            }
            if(i == m -1 && temp.size() != 0) {
                if(ret.size() != 0){
                    temp +=" ";
                }
                ret = temp + ret;
                temp = "";
            }
        }
        return ret;
    }
};

代码2:ac
在这里插入图片描述

class Solution {
public:
    void my_reverse(string& s, int begin, int end)
    {
        while(begin < end)
        {
            char temp = s[begin];
            s[begin] = s[end];
            s[end] = temp;
            begin++; end--;
        }
    }
    string reverseWords(string s) {
        reverse(s.begin(), s.end());
        while(s.size()){
            if(s[s.size()-1] != ' ' && s[0] != ' ')
                break;
            if(s[s.size()-1] == ' ')    
                s.pop_back();
            if(s[0] == ' ')
                s.erase(0,1);
        }
        if(s.size() == 0) return s;
        int m = s.size(), begin = 0, end = 0;
        for(int i = 0; i < m; i++)
        {
            if(s[i] != ' '){
                end++;
            }
            if(s[i] == ' ' || i == m-1){
                if(begin == end){       // 出现连续的空格
                    s.erase(begin,1);
                    i--;m--;
                } else {                // 窗口中有数
                    my_reverse(s, begin, end-1);    
                    begin = i+1; end = i+1;
                }
            }
        }
        return s;
    }
};
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
您好!对于您的问题,我可以给出以下的C语言代码实现: ```c #include <stdio.h> #include <string.h> void reverse(char* start, char* end) { while (start < end) { char temp = *start; *start = *end; *end = temp; start++; end--; } } void reverseWords(char* str) { char* wordStart = str; char* temp = str; while (*temp) { temp++; if (*temp == '\0') { reverse(wordStart, temp - 1); } else if (*temp == ' ') { reverse(wordStart, temp - 1); wordStart = temp + 1; } } reverse(str, temp - 1); } int main() { char str[] = "welcome to cvte"; printf("Original string: %s\n", str); reverseWords(str); printf("Reversed string: %s\n", str); return 0; } ``` 该程序中,我们定义了两个函数 `reverse` 和 `reverseWords`。其中,`reverse` 函数用于翻转一个字符串中的字符,`reverseWords` 函数用于翻转一个字符串中的所有单词。 在 `reverseWords` 函数中,我们先定义了两个指针 `wordStart` 和 `temp`,分别指向字符串的开始和结束位置。我们使用 `temp` 指针遍历整个字符串,当遇到空格或字符串结尾时,就调用 `reverse` 函数翻转 `wordStart` 和 `temp` 之间的字符。然后将 `wordStart` 指针移到下一个单词的开始位置,继续遍历字符串。最后,我们再一次调用 `reverse` 函数翻转整个字符串,得到最终结果。 以上代码输出结果为: ``` Original string: welcome to cvte Reversed string: cvte to welcome ``` 希望能够帮助到您!如果您还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值