• 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、要相信自己的想法和思考,同时也要专注

  • 相关阅读:
    Java 的 Apache Commons 工具库 助力开发
    【技术视界】鸿蒙开发套件之DevEco Profiler助您轻松分析应用性能问题
    组件的自定义事件②
    S0003-Mac下iTerm2+zsh+ohmyzsh打造优雅美观终端
    【JavaScript】-- 工厂模式&构造函数模式&原型模式
    vscode package.json文件开头的{总是提升警告
    Flink通过Native Kubernetes(k8s)方式Session模式和Application模式进行部署
    关于Copy On Write Array List,你会安全使用么
    springboot 中通过spring-cloud-vault组件绑定valut的配置
    用Python造轮子
  • 原文地址:https://blog.csdn.net/weixin_38853761/article/details/126476958