[动画详解]LeetCode151.翻转字符串里的单词

💖💖💖欢迎来到我的博客,我是anmory💖💖💖
又和大家见面了
欢迎来到动画详解LeetCode算法系列
用通俗易懂的动画让算法题不再神秘
先来自我推荐一波
个人网站欢迎访问以及捐款
推荐阅读
如何低成本搭建个人网站
专栏:动画详解leetcode算法题
C语言知识

玉桂狗吃东西

题目描述

题目描述


解题思路

我们的思路就是先让整句话变得正常,也就是去掉开头和结尾多余的空格
再去掉单词之间多余的空格
当句子变得正常之后,我们就可以先将整个字符串反转,再将每一个单词反转
这样就做到反转字符串里的单词了


动画详解

动画详解


代码实现

// 翻转字符串中指定范围的字符
void reversePos(char* s, int start, int end)
{
    int left = start;
    int right = end;
    char* tmp;
    while (left <= right)
    {
        tmp = s[right];
        s[right] = s[left];
        s[left] = tmp;
        left++;
        right--;
    }
}

// 去除单词中多余的空格
void delSpace(char* s)
{
    // 使用双指针来删除单词中多余的空格
    int left = 0;
    int right = strlen(s)-1;
    // 删除第一个单词之前的空格
    while(s[left] == ' ')
    {
        left++;
    }
    // 删除最后一个单词之后的空格
    while(s[right] == ' ')
    {
        right--;
    }
    // 删除单词中间多余的空格,双指针法删除
    int slow = 0;
    for(int i = left;i<=right; i++)
    {
        // 如果遇到两个及以上空格那么就跳过
        if(s[i]==' ' && s[i+1]==' ')
        {
            continue;
        }
        s[slow] = s[i];
        slow++;// i不++,因为在循环内部i已经在++了
    }
    s[slow] = '\0';// 在最后添加\0
}

char* reverseWords(char* s) 
{
    // 先删除两端和中间多余的空格
    delSpace(s);
    // 反转整个字符串
    reversePos(s,0,strlen(s)-1);
    // 反转字符串里的单词
    int slow = 0;// 指向每一个单词开头的指针
    for(int i = 0; i<=strlen(s); i++)// 遍历字符串,包括\0
    {
        if(s[i]==' '|| s[i]=='\0')// 当位置为空或\0就说明单词结束
        {
            reversePos(s,slow,i-1);// 此时i所在的地方字符是空格
            slow = i+1;
        }
    }
    return s;
}

复杂度分析

可以看出循环的层数都是一层,因此时间复杂度为O(n)


总结

💖💖💖非常感谢各位的支持💖💖💖
我们共同进步
本系列持续更新,关注我,带你手撕算法题
下期再见
玉桂狗吃东西

  • 19
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿梦Anmory

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值