• LeetCode讲解篇之151. 反转字符串中的单词


    151. 反转字符串中的单词

    题目描述

    给你一个字符串 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) 额外空间复杂度的 原地 解法。

    解答思路

    对于这道题,我们可以将字符串按照空白字符串分隔来得到字符串单词数组,然后对该单词数组反转,即可得到最终结果

    解答代码

    func reverseWords(s string) string {
        // 单词数组
        words := make([]string, 0)
        // 当前单词的开始下标
        var start = -1
    
        // 遍历字符串,提取单词数组
        for i := 0; i < len(s); i++ {
            if start == -1 && s[i] != ' ' {
                // 如果当前单词还不存在开始下标,并且当前字符不为空格,则意味着字符是当前单词的开始,更新当前单词开始下标
                start = i
            } else if start >= 0 && s[i] == ' ' {
                // 当前单词存在开始下标,并且当前字符为空格,则意味着当前单词已遍历完毕,当前下标就是当前单词结束下标的下一个,追加当前单词,取消下个单词的开始下标
                words = append(words, s[start:i])
                start = -1
            }
        }
    
        if start >= 0 {
            // 当前单词存在开始下标,意味着当前单词不存在空格,因为遇到空格当前单词会被追加,并且取消开始下标,应此可以放心的追加当前单词
            words = append(words, s[start:len(s)])
        }
        
        // 单词数据的长度
        l := len(words)
        // 单词数组的长度的一半
        n := l >> 1
        l--
    
        // 遍历单词数组的左半边,反转单词数组
        for i := 0; i < n; i++ {
            // 对换当前单词和当前单词沿单词数组的中心轴对称的单词
            words[i], words[l-i] = words[l-i], words[i]
        }
        return strings.Join(words, " ")
    }
    
    • 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
  • 相关阅读:
    【算法训练-贪心算法 一】买卖股票的最佳时机II
    [附源码]Python计算机毕业设计SSM金牛社区疫情防控系统(程序+LW)
    Vue2.0 —— 由设计模式切入,实现响应式原理
    网络代理技术的广泛应用和安全保障
    软考高项(十三)项目资源管理 ★重点集萃★
    Ubuntu20.04 Mysql基本操作知识
    [附源码]java毕业设计医院疫情疾控管理系统
    63 x的平方根
    现在大一,请问前端还值得学习吗
    又一国产摄像机发布
  • 原文地址:https://blog.csdn.net/qq_67733273/article/details/132811730