如何从整数中提取连续重复数字字符串?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"]
逻辑说明:
num.to_s将整数转为字符串;chunk { |char| char }按字符分组,把连续相同的字符归为一组;select { |_, group| group.size >=2 }筛选出长度至少为2的组(即连续重复的数字);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
相关产品推荐
相关产品推荐

