LeetCode 151. 反转字符串中的单词

LeetCode 151. 反转字符串中的单词

题目描述

给定一个字符串 s,你需要反转字符串中单词的顺序,同时去除多余的空格。

示例 1:

复制代码
输入: "the sky is blue"
输出: "blue is sky the"

解题思路

  1. 去除多余空格:首先,我们需要去除字符串开头、结尾以及单词之间多余的空格。
  2. 反转整个字符串:然后,反转整个字符串。
  3. 反转每个单词:最后,反转每个单词,恢复单词的原始顺序。

C语言题解

c 复制代码
#include <stdio.h>
#include <string.h>

// 去除多余空格
void removeExtraSpaces(char *s) {
    int len = strlen(s);
    int slow = 0; // 慢指针,用于构建新字符串
    for (int fast = 0; fast < len; fast++) {
        // 跳过空格
        if (s[fast] != ' ') {
            // 在单词之间添加一个空格
            if (slow != 0) {
                s[slow++] = ' ';
            }
            // 复制单词
            while (fast < len && s[fast] != ' ') {
                s[slow++] = s[fast++];
            }
        }
    }
    s[slow] = '\0'; // 添加字符串结束符
}

// 反转字符串
void reverseString(char *s, int start, int end) {
    while (start < end) {
        char temp = s[start];
        s[start] = s[end];
        s[end] = temp;
        start++;
        end--;
    }
}

// 反转字符串中的单词
void reverseWords(char *s) {
    // 1. 去除多余空格
    removeExtraSpaces(s);
    int len = strlen(s);
    
    // 2. 反转整个字符串
    reverseString(s, 0, len - 1);
    
    // 3. 反转每个单词
    int start = 0;
    for (int i = 0; i <= len; i++) {
        if (s[i] == ' ' || s[i] == '\0') {
            reverseString(s, start, i - 1);
            start = i + 1;
        }
    }
}

// 测试主函数
int main() {
    char s[] = "the sky is blue";
    printf("Original: \"%s\"\n", s);
    
    reverseWords(s);
    
    printf("Reversed: \"%s\"\n", s);
    
    return 0;
}

代码逐行解释

  1. #include <stdio.h>#include <string.h>:包含标准输入输出库和字符串处理库。
  2. void removeExtraSpaces(char *s) :定义一个函数 removeExtraSpaces,用于去除多余的空格。
    • int slow = 0;:慢指针,用于构建新字符串。
    • for (int fast = 0; fast < len; fast++):快指针遍历字符串。
    • if (s[fast] != ' '):如果当前字符不是空格,则处理。
    • if (slow != 0):在单词之间添加一个空格。
    • while (fast < len && s[fast] != ' '):复制单词。
    • s[slow] = '\0';:添加字符串结束符。
  3. void reverseString(char *s, int start, int end) :定义一个函数 reverseString,用于反转字符串的指定部分。
    • while (start < end):交换字符,实现反转。
  4. void reverseWords(char *s) :定义一个函数 reverseWords,用于反转字符串中的单词。
    • removeExtraSpaces(s);:去除多余空格。
    • reverseString(s, 0, len - 1);:反转整个字符串。
    • for (int i = 0; i <= len; i++):遍历字符串,反转每个单词。
  5. int main() :主函数,用于测试 reverseWords 函数。
    • char s[] = "the sky is blue";:定义一个测试字符串。
    • printf("Original: \"%s\"\n", s);:打印原始字符串。
    • reverseWords(s);:调用 reverseWords 函数反转字符串中的单词。
    • printf("Reversed: \"%s\"\n", s);:打印反转后的字符串。

运行结果

复制代码
Original: "the sky is blue"
Reversed: "blue is sky the"

总结

通过去除多余空格、反转整个字符串以及反转每个单词,我们可以有效地实现字符串中单词顺序的反转。这种方法的时间复杂度为 O ( n ) O(n) O(n),其中 n n n 是字符串的长度。


CSDN博客链接 : LeetCode 151. 反转字符串中的单词 - C语言题解

相关推荐
AI软著研究员4 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish4 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱5 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者21 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮21 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法