算法是求职的敲门砖,大厂面试一面几乎都会问算法题,以此来考察候选人的思维逻辑及编码能力。

今天要AC的题目叫做「颠倒字符串中的单词」,在 leetcode 上的原题链接为:https://leetcode.cn/problems/reverse-words-in-a-string/

第1.9篇·颠倒字符串中的单词 - 图1

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至少存在一个 单词

2. 解题思路

题目意思非常容易理解,输入一串以空格分割的英文单词,以单词为单位倒序输出。题目保证了入参是非纯空格的,同时至少会存在一个空格将单词分隔开。

需要注意的是,在单词之间可能存在多个空格的情况,这是需要特殊处理的。

作为一个没有感情的 JDK API 选手,我觉得使用 String API 就足够了。

首先将入参使用 String#split 方法基于单个空格分割为一个字符串数组,然后进行倒序遍历,遍历过程中再通过 String#replace 方法将多余的空格删除,同时排除都是空格的情况。

最后使用一个索引变量加上单词之间的空格,即得到了题目想要的结果。

用 Java 实现上述思路的代码是:

第1.9篇·颠倒字符串中的单词 - 图2

上述示例代码在 leetcode 上的执行结果是:

第1.9篇·颠倒字符串中的单词 - 图3

最后,本文收录于个人语雀知识库: 我所理解的后端技术,欢迎来访。