[String] 557. 反转字符串中的单词 III
题目
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
1
2
输入: "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
**注意 : ** 在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
思路
- 将句子中每个单词拆分
- 逐词反转
- 最后拼接起来
完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
var reverseWords = str => { // 接收传入的字符串
// 1. 将接收的字符串按照空格拆分, "asd zxc qwe" => ["asd", "zxc", "qwe"]
var arr = str.split(' ')
var res = []
// 2. 遍历拆分后的每个单词
arr.forEach(item => {
var reverseW = item.split('').reverse().join('') // 将 item 先拆分, 翻转, 合并.
res.push(reverseW) // 存入预先创建的数组中
})
return res.join(' ')
}
reverseWords('asd zxc qwe') //dsa cxz ewq
其实功能已经实现了, 我们应该考虑下代码美观的问题了.
优化后的代码:
1
2
3
4
5
6
var reverseWords = str => {
// 这里用 map 是为了他可以将得到的结果直接返回原先的数组中, 不需要再创建一个数组保存结果
return str.split(' ').map(item => {
return item.split('').reverse().join('') // 将 item 先拆分, 翻转, 合并.
}).join(' ') // 返回字符串
}
提交结果
优化前的代码:
优化后的代码:
看来少创建一个接收结果的数组, 真的可以节省不少的运行时间.
[Array] 17. 电话号码的字母组合
题目
给定一个仅包含数字 2-9
的字符串,返回所有它能表示的字母组合。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例:
1
2
输入:"23"
输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].
思路:
将输入的数字拆分, 关联对应的字母, 利用数组的循环逐次拼接, 最终生成完整的数组.
具体步骤
1. 定义数组 map
存放数字对应的字母
2. 接收传入字符串, 利用 split()
函数拆分
3. 利用 forEach()
函数将字符串数组与 map
数组关联如: ["2", "3", "4"] => ["abc", "def", 'ghi', 'jkl']
4. 使用上一步生的数组, 每次利用这个数组的第0位与第1位进行组合, 组合生成的结果 splice()
返回数组, 放在第0位上, 再与后面一位进行组合, 直到该数组的长度为 1 时, 返回第 0 位即可.
5. 对输入 “” 或 个位数(如”1”, “2”, “3”), 进行兼容.
6. 提交代码
完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/**
* @param {string} digits 输入的字符串
* @return {string[]}
*/
var letterCombinations = function(digits) {
// 定义数组 `map` 存放数字对应的字母
let map = ['', 1, 'abc', 'def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
// 兼容输入的是 ""
if(digits === '') {
return []
}
// 将输入的号码进行分隔, 234 => [2,3,4]
let num = digits.split('')
// 保存输入号码对应的字母, ["2", "3", "4"] => ["abc", "def", 'ghi', 'jkl']
let code = []
num.forEach(item => {
if(map[item]) {
code.push(map[item])
}
});
// 兼容输入的是个位数(如"1", "2", "3")
if(code.length === 1) {
var temp = []
for(let i = 0; i < code[0].length; i ++) {
temp.push(code[0][i])
}
return temp
}
let comb = arr => {
var temp = []
for(let i = 0; i < arr[0].length; i ++) {
for(let k = 0; k < arr[1].length; k ++) {
temp.push(`${arr[0][i]}${arr[1][k]}`) // 这里使用了模板字符串
}
}
arr.splice(0, 2, temp)
if(arr.length > 1) {
comb(arr)
}
return arr[0]
}
return comb(code)
};