前言
方法有
- reverse
- 利用额外空间
- 递归实现
- reduce
- 正则表达式+reverse(实际还是 reverse🤪)
- map+reverse(实际还是 reverse🤪)
实现
1. 利用数组的 reverse
2. 利用额外空间
3. 递归
思路
- 把 【 每次递归得到】字符串 【s】 分成两部分 :1. 第一个字符 str[0] ; 2. 从第二个到最后个字符 str.slice(1)
- 拼接 :str.slice(1) + str[0]
- 返回【 s 】
拓展
在 JavaScript 中,slice()
和 substr()
都是字符串截取方法,但有以下关键区别:
1. 参数语义不同
js
str.slice(startIndex, endIndex) // 结束索引(不包含)
str.substr(startIndex, length) // 截取长度
2. 负值参数处理
slice()
:负数表示从字符串末尾倒算
js
'hello'.slice(-3) // "llo"(相当于 slice(2))
substr()
:第一个参数为负数时从末尾计算,第二个参数(长度)为负数时返回空字符串
arduino
'hello'.substr(-3) // "llo"
'hello'.substr(1, -1) // ""
3. 返回值差异
python
'hello'.slice(1,3) // "el"(索引 1 到 3 之前)
'hello'.substr(1,3) // "ell"(从索引 1 截取 3 个字符)
刚才的应用:
rust
// 两个写法效果相同是因为:
str.slice(1) // 从索引1截取到末尾(返回新字符串)
str.substr(1) // 从索引1截取剩余全部(省略第二个参数时默认到末尾)
推荐建议:
substr()
已被 MDN 标记为遗留函数 ,建议优先使用slice()
- 当需要明确指定截取长度时可用
substring()
替代substr()
(通过递归调用 slice(1)/substr(1)
都能实现字符串反转,因为每次递归都会剥离首字符追加到末尾)
4.reduce
- 关于 reduce
c
array.reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)
-
callback
是一个回调函数,包含四个参数:accumulator
:累加器,累积回调的返回值;它是上一次调用回调时返回的值 ,或者是初始值 (initialValue
)。currentValue
:数组中正在处理的当前元素。currentIndex
(可选):数组中正在处理的当前元素的索引。array
(可选):调用 reduce 的数组。
-
initialValue
(可选):作为第一次调用回调函数时accumulator
的值。如果没有提供初始值,reduce 会从数组的第二个元素开始执行回调函数,accumulator
会被赋值为数组的第一个元素。
2.过程
ini
everseStr('hello')
// 第一次迭代: pre = '', sub = 'h' => 'h'
// 第二次迭代: pre = 'h', sub = 'e' => 'eh'
// 第三次迭代: pre = 'eh', sub = 'l' => 'leh'
// 第四次迭代: pre = 'leh', sub = 'l' => 'lleh'
// 第五次迭代: pre = 'lleh', sub = 'o' => 'olleh'
// 最终结果: 'olleh'
5.正则表达式+reverse
关于正则表达式 , 可以看我的这篇
javascript
function reverseStr(str) {
// 正则表达式 . 任意字符
return (str.replace(/./g, (char) => char)).split('').reverse().join('')
}
console.log(reverseStr("abc"))
6.map+reverse
lua
function reverseStr(str) {
return [...str].map(char => char).reverse().join('')
}