力扣-151. 反转字符串中的单词

看下去,你一定可以理解此题,写的简单易懂

力扣题目

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = “the sky is blue”
输出:“blue is sky the”
示例 2:

输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:

输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

解题思路

1.通过removeElement函数来去掉字符串中多余的0;
2.通过revise函数先反转整个字符串;
3.在反转每一个单词,就达到了题目中的要求。
(反转每一个单词过程可以参考我的此篇文章-力扣-557. 反转字符串中的单词 III

函数构成

1.反转函数

void revise(char* start, char* end)
{
   
    char temp;
    while (start < end)
    {
   
        temp = *end;
        *end = *start;
        *start = temp;
        start++;
        end--;
    }
}

只需要输入反转的起始地址和终止地址即可完成反转

2.消除掉多余空格函数

int removeElement(char* str, int len, int val)
{
   
    int slow = 0; //慢指针
    int fast = 0; //快指针
    for (fast = 0; fast < len; fast++)
    {
   
        if (val != str[fast])/*如果不是空格就赋值*/
        {
   
            if (slow != 0)/*确保字符串的最前边没有空格*/
            {
   
                str[slow] = ' ';
                slow++;
            }
        }

        while ((fast < len) && str[fast] != val)/*快指针遍历一个完整的单词赋值给慢指针*/
        {
   
            str[slow] = str[fast];
            slow++;
            fast++;
        }
        
    }

    str[slow] = '\0';
    
    return slow;
}

整体函数

void revise(char* start, char* end)
{
   
    char temp;
    while (start < end)
    {
   
        temp = *end;
        *end = *start;
        *start = temp;
        start++;
        end--;
    }
}
int removeElement(char* str, int len, int val)
{
   
    int slow = 0; //慢指针
    int fast = 0; //快指针
    for (fast = 0; fast < len; fast++)
    {
   
        if (val != str[fast])/*如果不是空格就赋值*/
        {
   
            if (slow != 0)/*确保字符串的最前边没有空格*/
            {
   
                str[slow] = ' ';
                slow++;
            }
        }

        while ((fast < len) && str[fast] != val)/*快指针遍历一个完整的单词赋值给慢指针*/
        {
   
            str[slow] = str[fast];
            slow++;
            fast++;
        }
        
    }

    str[slow] = '\0';
    
    return slow;
}

char* reverseWords(char* s)
{
   
    char* start = NULL;
    char* end = NULL;
    int len = strlen(s);
    int i = 0;

    /*取得移除多余0后字符串的长度*/
    len = removeElement(s, len, ' ');

    /*反转全部字符串*/
    revise(&s[0], &s[len - 1]);

    /*反转每一个单词*/
    start = s;/*字符串首地址赋值*/

    for (i = 0; i < len; i++)
    {
   
        if (s[i] == ' ')
        {
   
            end = &s[i];/*记录空格的位置*/
            revise(start, end - 1);
            start = end + 1;/*记录空格后字符的位置*/
        }
        else if (s[i + 1] == '\0')/*最后一个单词特殊处理*/
        {
   
            end = &s[i];
            revise(start, end);
            start = NULL;
        }
    }
    return s;
}

如果有需要可以跳转leetcode直接看我提交的解题:151. 反转字符串中的单词

相关推荐

  1. -151. 字符串单词

    2023-12-10 16:10:02       44 阅读
  2. 字符串单词151

    2023-12-10 16:10:02       14 阅读
  3. [题解] 151. 字符串单词

    2023-12-10 16:10:02       10 阅读
  4. 每日一题 --- 字符串单词[][Go]

    2023-12-10 16:10:02       22 阅读
  5. 面试经典题---151.字符串单词

    2023-12-10 16:10:02       38 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-10 16:10:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-10 16:10:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-10 16:10:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-10 16:10:02       20 阅读

热门阅读

  1. 聊聊spring.mvc.servlet.load-on-startup

    2023-12-10 16:10:02       34 阅读
  2. HarmonyOS--ArkTS(1)--基本语法(2)

    2023-12-10 16:10:02       40 阅读
  3. K8S学习指南(3)-minikube的安装

    2023-12-10 16:10:02       33 阅读
  4. 从零开始搭建链上dex自动化价差套利程序(10)

    2023-12-10 16:10:02       36 阅读
  5. STM32F103

    STM32F103

    2023-12-10 16:10:02      49 阅读
  6. C语言光标定位,去掉光标

    2023-12-10 16:10:02       34 阅读