-
Notifications
You must be signed in to change notification settings - Fork 0
Open
Description
题目描述: 给定一个字符串,逐个翻转字符串中的每个单词。(原题地址: https://leetcode-cn.com/problems/reverse-words-in-a-string/)
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
- 无空格字符构成一个单词。
- 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
- 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
进阶:
请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。
(先不说C语言的实现)
思考: 看到这题我的第一想法就是用正则, 然后倒序合并就行了. 或者不太会正则, 简单的数组操作也行. 但是复杂度不能达到O(1)。先写处理问题的答案吧, 从简单到困难.
- (非正则的数组操作) 首先先从字符串到数组的转换, 然后倒序根据空格来获取单词, 再合并. 最后考虑到i=0后 str还有值的情况, 需要再push str.
代码如下:
var reverseWords = function(s) {
let arr = s.split('')
let goalArr = []
let str = ''
for(let i = arr.length - 1; i >= 0; i -= 1) {
if (arr[i] === ' ') {
if (str) {
goalArr.push(str)
str = ''
}
} else {
str = arr[i] + str
}
}
if (str) {
goalArr.push(str)
}
return goalArr.join(' ')
};
运行结果效率一般, 但是空间问题很大.
- (正则实现) 其实正则实现, 写代码是最简单的. 难得不过是记不住正则的规则和写法. 用上正则几行代码就能搞定.
var reverseWords = function(s) {
if (s.trim()) {
let arr = s.match(/\S+/g)
arr.reverse()
return arr.join(' ')
}
return s.trim()
};
就这么几行代码, 就能实现. 是不是很easy, 让我们看看运行结果.
运行结果:
空间问题倒是可以了, 但是运行效率比方法1低.
这些都比较依赖于语言的api了, 感兴趣的可以用C手写试试.
Metadata
Metadata
Assignees
Labels
No labels