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

相关推荐
软件测试媛17 分钟前
软件测试——面试八股文(入门篇)
软件测试·面试·职场和发展
强盛小灵通专卖员2 小时前
分类分割详细指标说明
人工智能·深度学习·算法·机器学习
IT猿手6 小时前
基于强化学习 Q-learning 算法求解城市场景下无人机三维路径规划研究,提供完整MATLAB代码
神经网络·算法·matlab·人机交互·无人机·强化学习·无人机三维路径规划
万能程序员-传康Kk9 小时前
旅游推荐数据分析可视化系统算法
算法·数据分析·旅游
PXM的算法星球9 小时前
【并发编程基石】CAS无锁算法详解:原理、实现与应用场景
算法
ll7788119 小时前
C++学习之路,从0到精通的征途:继承
开发语言·数据结构·c++·学习·算法
烨然若神人~9 小时前
算法第十七天|654. 最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树
算法
爱coding的橙子9 小时前
每日算法刷题Day2 5.10:leetcode数组1道题3种解法,用时40min
算法·leetcode
阳洞洞10 小时前
leetcode 18. 四数之和
leetcode·双指针
程序媛小盐10 小时前
贪心算法:最小生成树
算法·贪心算法·图论