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

前言

方法有

  • reverse
  • 利用额外空间
  • 递归实现
  • reduce
  • 正则表达式+reverse(实际还是 reverse🤪)
  • map+reverse(实际还是 reverse🤪)

实现

1. 利用数组的 reverse

2. 利用额外空间

3. 递归

思路

  • 把 【 每次递归得到】字符串 【s】 分成两部分 :1. 第一个字符 str0 ; 2. 从第二个到最后个字符 str.slice(1)
  • 拼接 :str.slice(1) + str0
  • 返回【 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('')
}
相关推荐
ModyQyW17 分钟前
vite-plugin-uni-manifest 更新了什么
前端·typescript·uni-app
Asize1 小时前
AI 协作开发新范式:我用 SDD 做了个排版 npm 包
前端·人工智能
kyriewen3 小时前
我把今年流传的前端 AI 面试题整理了一遍——4 类场景题+回答框架(附速查表)
前端·面试·程序员
计算机魔术师3 小时前
国产多模态模型正面硬刚Opus旗舰:差距从30%缩到3%
前端
风骏时光牛马3 小时前
程序员进阶:深度思考,解锁职场成长的底层逻辑
前端
IT_陈寒4 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端
爱丶不疚4 小时前
Eval: Agent 说的 Eval 是什么?从单测、TDD 到 Sentry 聊起
前端·ai编程·vibecoding
求道於盲4 小时前
python中的类型标注
前端
计算机魔术师4 小时前
从硅谷测试到全球铺开,ChatGPT广告的10亿美元秘密
前端
AEI5 小时前
四年间大模型的演进历程
人工智能·面试·程序员