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

前言

方法有

  • 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('')
}
相关推荐
ange20178 分钟前
前端工程的相关管理 git、branch、build
前端·git
C+ 安口木1 小时前
纯前端实现图文识别 OCR
前端·javascript·ocr
白熊1881 小时前
【通用智能体】Lynx :一款基于终端的纯文本网页浏览器
前端·人工智能·chrome·通用智能体
二川bro1 小时前
Cursor 模型深度分析:区别、优缺点及适用场景
前端
NoneCoder1 小时前
正则表达式与文本处理的艺术
前端·javascript·面试·正则表达式
神奇萝卜头2 小时前
Go电商项目--Ai模拟面试:验证码模块
面试·golang
广药门徒2 小时前
OpenMV IDE 的图像接收缓冲区原理
前端·人工智能·python
霸王蟹2 小时前
常见面试题:Webpack的构建流程简单说一下。
前端·笔记·学习·webpack·node.js·vue
黄暄2 小时前
Linux项目部署全攻略:从环境搭建到前后端部署实战
java·linux·运维·服务器·前端·后端·持续部署
island13142 小时前
JAVA Web 期末速成
java·开发语言·前端