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

前言

方法有

  • 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('')
}
相关推荐
星光不问赶路人1 分钟前
vue3使用jsx语法详解
前端·vue.js
天蓝色的鱼鱼5 分钟前
shadcn/ui,给你一个真正可控的UI组件库
前端
布列瑟农的星空8 分钟前
前端都能看懂的Rust入门教程(三)——控制流语句
前端·后端·rust
Mr Xu_14 分钟前
Vue 3 中计算属性的最佳实践:提升可读性、可维护性与性能
前端·javascript
jerrywus20 分钟前
我写了个 Claude Code Skill,再也不用手动切图传 COS 了
前端·agent·claude
玖月晴空24 分钟前
探索关于Spec 和Skills 的一些实战运用-Kiro篇
前端·aigc·代码规范
子兮曰29 分钟前
深入理解滑块验证码:那些你不知道的防破解机制
前端·javascript·canvas
会一丢丢蝶泳的咻狗1 小时前
Sass实现,蛇形流动布局
前端·css
攀登的牵牛花1 小时前
前端向架构突围系列 - 状态数据设计 [8 - 4]:有限状态机 (FSM) 在复杂前端逻辑中的应用
前端
Lsx_1 小时前
前端视角下认识 AI Agent 和 LangChain
前端·人工智能·agent