• leetcode-151. 颠倒字符串中的单词-20220823


    1. 颠倒字符串中的单词
      给你一个字符串 s ,颠倒字符串中 单词 的顺序。

    单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

    返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

    注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

    示例 1:

    输入:s = “the sky is blue”
    输出:“blue is sky the”
    示例 2:

    输入:s = " hello world "
    输出:“world hello”
    解释:颠倒后的字符串中不能存在前导空格和尾随空格。
    示例 3:

    输入:s = “a good example”
    输出:“example good a”
    解释:如果两个单词间有多余的空格,颠倒后的字符串需要将单词间的空格减少到仅有一个。

    提示:

    1 <= s.length <= 104
    s 包含英文大小写字母、数字和空格 ’ ’
    s 中 至少存在一个 单词

    思考:整个题目要是使用额外空间,可以直接做,那么如果要是不使用额外空间呢?
    整体思路就是先去掉多余的空格,然后对处理后的字符串进行翻转,最后对每个单词进行翻转就可以得到答案,思路比较明确,上代码了~

    // 首先如果要是申请额外空间,这个题目没有什么难度
    // 如果要求空间复杂度为O(1)的话,那么如何实现题目要求呢?
    // 1、单词的位置要翻转 -- 去掉空格以后将数组整体翻转,然后再对单词实现翻转
    // 2、去掉多余的空格 -- 参考数组去掉某一个元素的方法
    
    char * reverseWords(char * s){
        int len = strlen(s);
        // 去掉多余的空格
        // 如果用双循环的话就很容易做到,但是时间复杂地为O(n^2),如何实现O(n)的时间复杂度的算法呢?
        // 使用双指针中的快慢指针进行处理,按照单词放置位置的规则进行规整
        int fast;
        int slow = 0;
        for (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';
        len = strlen(s);
        // 进行整个字符串的翻转
        int i;
        fast = 0;
        slow = len - 1;
        char tmp;
        for (i = 0; i < len / 2; i++) {
            tmp = s[fast];
            s[fast] = s[slow];
            s[slow] = tmp;
            fast++;
            slow--;
        }
    
        // 对单词进行翻转
        fast = 0;
        slow = 0;
        int j = 0;
        int k;
        for (i = 0; i < len; i++) {
            if (s[i] == ' ') {
                fast = i - 1;
                for (k = j; k < (i + j) / 2; k++) {
                    tmp = s[fast];
                    s[fast] = s[slow];
                    s[slow] = tmp;
                    fast--;
                    slow++;
                }
                slow = i + 1;
                j = i + 1;
            }
        }
    
        // 对最后一个单词进行单独处理
        fast = i - 1;
        for (k = j; k < (i + j) / 2; k++) {
            tmp = s[fast];
            s[fast] = s[slow];
            s[slow] = tmp;
            fast--;
            slow++;
        }
        return s;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67

    总结:
    1、首先自己做,然后再看教程,最后进行对比以后学习和完善
    2、要相信自己的想法和思考,同时也要专注

  • 相关阅读:
    路由器二次开发一步一步把工业路由器变成一个高端的可指定出网、节点和链路的路由器,包含详细过程及快捷脚本(五)
    Elasticsearch实战(七)---BestFields MostFields CrossFields 多字段搜索策略
    python图
    ImmunoChemistry艾美捷绿色活/死染色解决方案
    工业企业数据库匹配土地出让数据库(2000-2014年)
    STC51单片机33——液晶12864显示
    浅谈免杀下的持久化
    vue2学习之插槽
    小白学习 Python 时会遇到哪些很常见的问题?
    使用 Sealos 一键私有化部署 Serverless 框架 Laf
  • 原文地址:https://blog.csdn.net/weixin_38853761/article/details/126476958