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

如何从整数中提取连续重复数字字符串?Ruby实现优化

Ruby提取整数中连续重复数字字符串的正确实现

原代码的问题在于逻辑错误:它把所有与前一个或后一个字符相同的字符都收集到result数组,拼接成一个长字符串后,用无参数的split(默认按空白分割),自然只会得到一个包含整个长字符串的数组,无法区分不同的连续重复组。

方案一:使用chunk方法(直观易读,Ruby风格)

利用Ruby的Enumerable#chunk方法可以轻松将连续相同的字符分组,再筛选出长度≥2的组并拼接成字符串:

def extract_consecutive_duplicates(num)
  num.to_s.chunk { |char| char }
       .select { |_, group| group.size >= 2 }
       .map { |_, group| group.join }
end

# 测试
p extract_consecutive_duplicates(1234555567899944) # => ["5555", "999", "44"]

逻辑说明:

  1. num.to_s将整数转为字符串;
  2. chunk { |char| char }按字符分组,把连续相同的字符归为一组;
  3. select { |_, group| group.size >=2 }筛选出长度至少为2的组(即连续重复的数字);
  4. map { |_, group| group.join }把每组字符拼接成完整的重复字符串。

方案二:使用正则表达式(简洁高效)

通过正则匹配连续重复至少2次的数字序列,直接提取结果:

def extract_consecutive_duplicates(num)
  num.to_s.scan(/((\d)\2+)/).map { |match| match[0] }
end

# 测试
p extract_consecutive_duplicates(1234555567899944) # => ["5555", "999", "44"]

正则说明:

  • (\d)\2+:(\d)捕获一个数字,\2+表示至少再出现一次该捕获的数字,确保是连续重复的同一个数字;
  • scan方法会返回所有匹配的结果数组,取每个匹配的第一个元素(即完整的重复字符串)即可。

原代码的修正思路(不推荐,仅作参考)

如果一定要基于原代码修改,需要调整逻辑,跟踪当前连续重复的组,而不是单纯收集符合条件的字符:

a = 1234555567899944
arr = a.to_s.split("")
result = []
current_group = []

arr.each_with_index do |x, y|
  if x == arr[y+1]
    current_group << x
  else
    if !current_group.empty?
      current_group << x
      result << current_group.join
      current_group = []
    end
  end
end

p result # => ["5555", "999", "44"]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:03:27