如何用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
相关产品推荐
相关产品推荐

