算法刷题系列,详解解题过程中遇到的知识点,解释过一遍的知识点不会重复解释。
解题思路
将字符串头尾空格去掉,然后将多个空格用正则替换成一个空格,根据空格分隔成数组,然后翻转转回字符串。
代码
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
return s.trim().replace(/\s+/g, ' ').split(' ').reverse().join(' ')
};
要点详解
1. 正则表达式
正则表达式是用于匹配字符串中组合的模式,使用一个正则表达式字面量,其由包含在斜杠内的模式组成。
let reg = /a+/
两种模式
- 简单模式
字面量由你想知道找到的字符构成,比如 /abc/就能且仅能匹配 "abc"。
- 特殊字符
当你需要匹配一个不确定的字符串时,比如匹配 1 个或者多个 "b" 或者寻找空格,就可以使用特殊字符,比如可以使用 /a+/ 来匹配 aaa + 表示一个或者多个。
特殊字符
- 断言,表示一个匹配在某些条件下发生。断言包含先行断言、后行断言和条件表达式。
/^a/匹配以a开头/$a/表示以a结尾/\ba/匹配a字符前没有另外一个字符位置。/\Ba/匹配a字符前有另外一个字符的位置。/a(?=b)/,匹配后面跟随b的a/a(?!b)/,匹配后面不跟随b的a/(?<=b)a/向后断言,匹配前面b开头的a/(?<!b)a/向后否定断言,匹配前面不以b开头的a
- 字符类,区分不同类型的字符,例如区分字母和数字。
/\d/匹配任何数字/\D/匹配任何非数字/\w/匹配任何字母数字/\W/匹配任何非字母数字/\s/匹配单个空白字符/\S/匹配空格意外的单个字符/\t/匹配水平制表符/\n/匹配换行符/\v/匹配垂直制表符/\f/匹配换页符/[\b]/匹配退格符/\0/匹配一个 NUL 字符,不要在此后面加上另一个数字。
- 组和范围,表示表达式字符的分组和范围。
/a|b/匹配"a"或"b"任意一个字符/[a-c]/匹配任何一个包含的字符,可以用-来指定字符范围。
- 量词,表示匹配的字符或表达式的数量。
/x*/表示将x匹配 0 次或者更多次。/x+/表示将x匹配 1 次或者更多次/x?/表示将x匹配 0 次或 1 次/x{n}/表示将x匹配 n 次/x{n, }/表示至少匹配 n 次/x{n, m}/表示匹配 n~m 次- 再以上符号后添加 ? 匹配非贪婪的字符串
2. trim()
string.trim() 去掉字符串头部和尾部的空格,并返回,且该方法不会改变原始字符串。
let a = ' 111 '
console.log(a.trim()); // '111'
3. replace()
string.replace(searchvalue,newvalue) 用一些字符,替换另一些字符,或替换与正则表达式匹配的子串,并返回,且该方法不会改变原始字符串。
// 用一些字符替换另一些字符
let a = 'abc'
console.log(a.replace('a', 'c')) // 'cbc'
// 替换与正则表达式匹配的字符
let a = 'abac'
console.log(a.replace(/[a]/g, b)) // 'bbbc'
4. split()
string.split(separator,limit)
把一个字符串分割成字符串数组并返回
参数
- separator,可选,字符串或者正则表达式,表示从该参数指定的地方分割,如果在 str 中省略或不出现分隔符,则返回的数组包含一个由整个字符串组成的元素。
- limit,可选,指定返回数组的最大长度。
let a = "1 2 3 4"
console.log(a.split(' ')); // ['1', '2', '3', '4']
console.log(a.split(/[1-2]/g) ) // ['', ' ', ' 3 4']
5. reverse()
array.reverse()
颠倒数组中元素的位置并返回,不改变原数组,
let a = [1,2,3,4]
console.log(a.reverse()) // [4, 3, 2, 1]
6. join()
array.join(separator)
用于把数组中的所有元素转换一个字符串
参数 separator,指定要使用的分隔符,如果省略该参数