You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化将字符串转换为相邻重叠两位整数数组的实现?

字符串滑动分割转数组的优化实现

现有字符串key = "41521",需将其转换为数组array = [41, 15, 52, 21]。当前实现代码如下:

array = []
array << key[0..1].to_i
array << key[1..2].to_i
array << key[2..3].to_i
array << key[3..4].to_i

请问是否存在更优的实现方式?

当然有更简洁、更符合Ruby风格的实现方式啦!给你分享几种常用的优化方案:

方法1:用each_cons实现(最推荐的Ruby风格)

Ruby的Enumerable#each_cons天生就是为这种滑动窗口取连续元素的场景设计的,代码简洁又易读:

key = "41521"
array = key.chars.each_cons(2).map { |a, b| (a + b).to_i }
# 输出结果:[41, 15, 52, 21]

简单解释下步骤:

  • key.chars把字符串拆成单个字符的数组:["4","1","5","2","1"]
  • each_cons(2)会依次取出数组中连续的2个元素,生成["4","1"]、["1","5"]这类子数组
  • 最后用map把每个子数组的两个字符拼接成字符串,再转成整数,一步到位生成目标数组。

方法2:正则表达式匹配

如果你习惯用正则,也可以用String#scan配合正向预查来实现滑动匹配:

key = "41521"
array = key.scan(/(?=(\d{2}))/).flatten.map(&:to_i)
# 输出结果:[41, 15, 52, 21]

这里的正则(?=(\d{2}))是正向预查,会逐个匹配字符串中每个位置后面的两位数字,scan会捕获所有符合条件的两位组合,最后转成整数数组即可。

方法3:基于索引的简洁写法

如果还是想基于索引操作,但不想重复写<<,可以用范围遍历一次性生成数组:

key = "41521"
array = (0...key.length-1).map { |i| key[i, 2].to_i }
# 输出结果:[41, 15, 52, 21]

(0...key.length-1)生成了所有需要的起始索引(0到3),key[i, 2]表示从索引i开始取2个字符,和key[i..i+1]效果一致,但写法更简洁。

这些方案的优势在于:

  • 符合DRY原则,没有重复的代码片段
  • 扩展性强:如果字符串长度变化(比如变成6位),不需要手动修改代码,会自动适配生成对应数量的元素

内容的提问来源于stack exchange,提问作者user6820969

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:30:31