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语言题解

相关推荐
千金裘换酒23 分钟前
LeetCode 移动零元素 快慢指针
算法·leetcode·职场和发展
wm104343 分钟前
机器学习第二讲 KNN算法
人工智能·算法·机器学习
NAGNIP1 小时前
一文搞懂机器学习线性代数基础知识!
算法
NAGNIP1 小时前
机器学习入门概述一览
算法
iuu_star1 小时前
C语言数据结构-顺序查找、折半查找
c语言·数据结构·算法
Yzzz-F2 小时前
P1558 色板游戏 [线段树 + 二进制状态压缩 + 懒标记区间重置]
算法
漫随流水2 小时前
leetcode算法(515.在每个树行中找最大值)
数据结构·算法·leetcode·二叉树
mit6.8242 小时前
dfs|前后缀分解
算法
扫地的小何尚3 小时前
NVIDIA RTX PC开源AI工具升级:加速LLM和扩散模型的性能革命
人工智能·python·算法·开源·nvidia·1024程序员节
千金裘换酒4 小时前
LeetCode反转链表
算法·leetcode·链表