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

前言

方法有

  • 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('')
}
相关推荐
Fantasywt1 小时前
THREEJS 片元着色器实现更自然的呼吸灯效果
前端·javascript·着色器
IT、木易2 小时前
大白话JavaScript实现一个函数,将字符串中的每个单词首字母大写。
开发语言·前端·javascript·ecmascript
张拭心4 小时前
2024 总结,我的停滞与觉醒
android·前端
念九_ysl4 小时前
深入解析Vue3单文件组件:原理、场景与实战
前端·javascript·vue.js
Jenna的海糖4 小时前
vue3如何配置环境和打包
前端·javascript·vue.js
uhakadotcom4 小时前
Apache CXF 中的拒绝服务漏洞 CVE-2025-23184 详解
后端·面试·github
uhakadotcom4 小时前
CVE-2025-25012:Kibana 原型污染漏洞解析与防护
后端·面试·github
uhakadotcom4 小时前
揭秘ESP32芯片的隐藏命令:潜在安全风险
后端·面试·github
uhakadotcom4 小时前
Apache Camel 漏洞 CVE-2025-27636 详解与修复
后端·面试·github
uhakadotcom4 小时前
OpenSSH CVE-2025-26466 漏洞解析与防御
后端·面试·github