力扣 151
给定一个字符串,逐个翻转字符串中的每个单词。
示例一
输入: “the sky is blue”
输出: “blue is sky the”
示例二
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例三
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
说明:
无空格字符构成一个单词。
输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
解法一 采用栈进行解题 时间复杂度 O(n)
const reseverStr2 = (str = '') => { // "hello world!"
if(str == ' ' || str.length == 0) return ''
let stack = new Stack()
let temp = ''
let p = 0 // 定义一个索引指针
for (const substr of str) {
if(str[p] == ' '){
if(temp != ''){
stack.push(temp)
temp = ''
}
}else{
temp += substr
if(p == str.length - 1){ // 避免示例一的情况,如果字符串不是以" "结尾,进入此判断
stack.push(temp)
}
}
p++
}
let result = ''
while(!stack.isEmpty()){
result += stack.peek()
result += ' ' // 最后会多加一个空格,在返回结果的时候去掉
stack.pop()
}
return result != '' ? result.substr(0, result.length - 1) : result
}
// 定义栈
function Stack (){
let items = []
this.push = function(ele){
items.push(ele)
}
this.pop = function(){
return items.pop()
}
this.peek = function(){
return items[items.length - 1]
}
this.isEmpty = function(){
return items.length === 0
}
this.clear = function(){
items = []
}
}
解法二 使用内嵌函数进行分割、反转操作,一次遍历 时间复杂度O(n)
const reseverStr = (str = '') => {
if(str == ' ' || str.length == 0) return ""
let strs = str.split(" ")
let newStrs = strs.reverse()
let newStr = ''
for (const key in newStrs) {
if(newStrs[key] != ' ' && newStrs[key].length != 0){
newStr = newStr + newStrs[key] + " "
}
}
return newStr.length > 0 ? newStr.substr(0, newStr.length - 1) : ""
}
本题解法已经上传,立即跳转
本题来源于力扣,更多解题思路请跳到本题