算法练习第6道-反转字符串的单词

172 阅读1分钟

题目

给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。

输入: s = "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"

分析

题目要求要将单词顺序反转,同时保留空格。

  • 首先分割数组,这样我们得到每个独立的单词的数组
  • 然后遍历数组,将数组中的每一项再次分割,并反转,再拼接在一起
  • 最后,我们将数组在拼接成字符串

代码实现

第一步

分割数组

s.split(' ')

第二步

遍历数组,然后分割每一项,反转,再拼接在一起

item.split('').reverse().join('')

第三步

将数组在拼接成字符串

s.split(' ').map(item => item.split('').reverse().join('')).join(' ')

整体代码如下

let reverseWords = function(s) {
  return s.split(' ').map(item => item.split('').reverse().join('')).join(' ')
}

优化

换一种思路, 我们先处理每个单词,我们要定义两个参数wordfinal

  • 利用for循环将每个单词都反转下,将这个参数赋值给word
  • 然后再处理空格,遇到空格就把单词赋值到final,同时清空word
  • 这样我们得到的final少了最后一个单词,所以最后我们要在加上word

实现第一步

let word = '', final = '', len = s.length
for (let i = 0; i < len; i++) {
  if (s[i] !== ' ') {
    word = s[i] + word
  }
}

实现第二步

final += (word + ' ')
word = ''

实现第三步

final += word

完整代码如下

let reverseWords = function (s) {
  let word = '', final = '', len = s.length
  for (let i = 0; i < len; i++) {
    if (s[i] !== ' ') {
      word = s[i] + word
    } else {
      final += (word + ' ')
      word = ''
    }
  }
  final += word
  return final
}