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

相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark1 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her11 天前
并查集-听课笔记
笔记·算法·并查集
码流子1 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven1 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法
wzdark1 天前
从算法设计模式看编程思维的抽象能力4
算法
2601_962218612 天前
万象生鲜系统称重自动多退少补算法解决生鲜非标品痛点
大数据·数据库·人工智能·python·算法