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

如何用Ruby找出字符串中的相同字符?(Advent of Code场景)

Advent of Code 2022 第3天任务问题解决

我正在完成Advent of Code 2022年第3天的任务,需求是将给定字符串分割为两半,找出这两半的共同字符。比如给定字符串'AbcDeFg'和'HijKgLMnn',需要找出其中的相同字符'g'。但我写的代码陷入了困境,以下是当前的Ruby代码:

file_data = File.read('Day_3_task1.txt')
arr = file_data.split("\n")

finals = []
arr.each do |x|
  len = x.length
  divided_by_two = len / 2
  second = x.slice!(divided_by_two..len).split('')
  first = x.split('')
  count = 0
  (0..len).each do |z|
    first.each do |y|
      if y == second[count]
        finals.push(y)
      end
    end
    count += 1
  end 
end

finals = finals.uniq

问题分析

  • x.slice!(divided_by_two..len)会修改原字符串x,虽然当前场景能得到前半部分,但逻辑不够直观,修改原变量容易引发意外问题
  • 循环范围(0..len)错误:second的长度是divided_by_two,循环到len会导致second[count]超出数组范围,返回nil,做无效比较
  • 嵌套循环找共同字符的效率低,且会重复添加相同字符,后续用uniq去重属于冗余操作

优化后的代码

file_data = File.read('Day_3_task1.txt')
arr = file_data.split("\n")

# 提取每个字符串两半的共同字符
finals = arr.map do |line|
  half_length = line.length / 2
  # 分割字符串为两半,转成集合便于求交集
  first_half = line[0...half_length].chars.to_set
  second_half = line[half_length..].chars.to_set
  # 取交集的第一个元素(题目保证每个字符串两半只有一个共同字符)
  first_half.intersection(second_half).first
end.compact

# 计算所有共同字符的优先级总和(符合题目完整需求)
priority_sum = finals.sum do |char|
  char == char.upcase ? (char.ord - 'A'.ord + 27) : (char.ord - 'a'.ord + 1)
end

puts priority_sum

优化说明

  • 使用line[0...half_length]和line[half_length..]分割字符串,不修改原变量,逻辑更清晰安全
  • 借助Ruby的Set集合,利用intersection方法快速求两个字符集合的交集,效率远高于嵌套循环
  • 用map方法直接处理每行并返回结果,代码更简洁易读
  • 补充了题目要求的优先级计算部分,直接得到最终需要的总和结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:50:26