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

相关推荐
喜欢吃燃面20 分钟前
C++算法竞赛:位运算
开发语言·c++·学习·算法
项目申报小狂人32 分钟前
算法应用上新!自适应更新策略差分进化算法求解球形多飞行器路径规划问题,附完整MATLAB代码
开发语言·算法·matlab
PAK向日葵7 小时前
【算法导论】PDD 0817笔试题题解
算法·面试
地平线开发者9 小时前
ReID/OSNet 算法模型量化转换实践
算法·自动驾驶
地平线开发者9 小时前
开发者说|EmbodiedGen:为具身智能打造可交互3D世界生成引擎
算法·自动驾驶
星星火柴93610 小时前
关于“双指针法“的总结
数据结构·c++·笔记·学习·算法
艾莉丝努力练剑11 小时前
【洛谷刷题】用C语言和C++做一些入门题,练习洛谷IDE模式:分支机构(一)
c语言·开发语言·数据结构·c++·学习·算法
C++、Java和Python的菜鸟13 小时前
第六章 统计初步
算法·机器学习·概率论
Cx330❀13 小时前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法