反转字符串中的单词

题目描述

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

示例:
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

题解

JavaScript 没有提供颠倒字符串的能力,只有一个数组方法 reverse() 可以颠倒数组元素的位置。比如,现有数组 arr['a', 'b', 'c'],应用 reverse() 方法后得到:

1
2
3
const arr = ['a', 'b', 'c'];
const result = arr.reverse();
console.log(result); // ['c', 'b', 'a']

利用 JavaScript 提供的字符串方法 split() 可以将一个字符串分割成以指定分隔符分隔的数组。下例,将一字符串分割成以字母为数组元素的数组:

1
2
3
const str = 'Welcome';
const resultArr = str.split('');
console.log(resultArr); // ['W', 'e', 'l', 'c', 'o', 'm', 'e']

resultArr 中数组元素颠倒位置后,再拼接为字符串,即可实现字符串的位置颠倒:

1
2
3
const reversedArr = resultArr.reverse(); // 得到颠倒后的数组
const reversedStr = reversedArr.join(''); // 得到颠倒后的字符串
console.log(reversedStr); // 'emocleW'

根据上面的思路,先将字符串 "Let's take LeetCode contest" 分割成以单词为单位的数组,再把数组中每个单词分割成以字母为数组元素的数组并执行颠倒操作,将颠倒后的数组拼接为字符串,这时得到了颠倒后的单词。最后,将单词拼接为字符串,便得到了颠倒后的字符串 "s'teL ekat edoCteeL tsetnoc"。实现如下:

1
2
3
4
5
6
7
8
/**
* @file reverseWords.js
*/
const str = "Let's take LeetCode contest";
const reversedArr = str.split(' ').map(item => {
return item.split('').reverse().join('')
})
const result = reversedArr.join(' ');

为了验证输出是否符合预期,使用测试工具 Jest 来验证:

1
2
3
4
5
6
7
8
9
10
/**
* @file reverseWords.test.js
*/
import reverseWords from './reverseWords';

const str = "Let's take LeetCode contest";
const reversedStr = "s'teL ekat edoCteeL tsetnoc";
test(`reverseWords: ${str}`, () => {
expect(str).toBe(reversedStr);
});

使用 jest [file] 验证要测试的文件:

1
2
3
4
5
6
7
8
9
$ jest ./reverseWords.test.js
PASS ./reverseWrods.test.ts
✓ reverseWords: Let's take LeetCode contest (3ms)

Test Suites: 1 passed, 1 total
Tests: 1 passed, 1 total
Snapshots: 0 total
Time: 1.089s
Ran all test suites matching /.\/reverseWrods.test.ts/i.

出处

来源:力扣(LeetCode)
链接:557. 反转字符串中的单词 III