面试官:字符串反转有多少种实现方式 ?| 一道题目检测你的基础

前言

方法有

  • 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截取剩余全部(省略第二个参数时默认到末尾)

推荐建议

  1. substr() 已被 MDN 标记为遗留函数 ,建议优先使用 slice()
  2. 当需要明确指定截取长度时可用 substring() 替代 substr()

(通过递归调用 slice(1)/substr(1) 都能实现字符串反转,因为每次递归都会剥离首字符追加到末尾)

4.reduce

  1. 关于 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

关于正则表达式 , 可以看我的这篇

juejin.cn/post/746480...

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('')
}
相关推荐
一个专注写代码的程序媛15 分钟前
vue组件间通信
前端·javascript·vue.js
一笑code25 分钟前
美团社招一面
前端·javascript·vue.js
懒懒是个程序员1 小时前
layui时间范围
前端·javascript·layui
NoneCoder1 小时前
HTML响应式网页设计与跨平台适配
前端·html
凯哥19701 小时前
在 Uni-app 做的后台中使用 Howler.js 实现强大的音频播放功能
前端
烛阴1 小时前
面试必考!一招教你区分JavaScript静态函数和普通函数,快收藏!
前端·javascript
GetcharZp1 小时前
xterm.js 终端神器到底有多强?用了才知道!
前端·后端·go
JiangJiang1 小时前
🚀 React 弹窗还能这样写?手撸一个高质量 Modal 玩起来!
前端·javascript·react.js
吃炸鸡的前端1 小时前
el-transfer穿梭框数据量过大的解决方案
前端·javascript
尤物程序猿1 小时前
【2025最新Java面试八股】如何在Spring启动过程中做缓存预热?
java·缓存·面试