Codewars Ruby问题:实现首非重复字符且保留原字符大小写
解决Codewars中忽略大小写的首个非重复字符问题
你的原代码问题出在严格区分大小写统计字符出现次数,导致无法满足「大小写视为同一字符,但返回原字符大小写」的要求。不需要用正则表达式,用哈希统计小写字符的出现次数再匹配原字符是更直接的方案:
def first_non_repeating_letter(s) lower_chars = s.downcase.chars # 统计每个小写字符的出现次数(Ruby 2.7+可用tally) char_count = lower_chars.tally # 遍历原字符串,找到第一个小写形式出现次数为1的原字符 s.chars.find { |char| char_count[char.downcase] == 1 } || "" end
代码说明:
- 先把整个字符串转成小写数组,统计每个小写字符的出现次数,得到一个键为小写字符、值为出现次数的哈希。
- 遍历原字符串的每一个字符,对每个字符转小写后去哈希里查次数,找到第一个次数为1的原字符——这样既保证了大小写不敏感的统计,又能保留原字符的正确大小写。
- 如果遍历完没找到,返回空字符串。
兼容低版本Ruby(<2.7)的写法:
如果你的Ruby版本不支持tally方法,可以用each_with_object手动统计:
def first_non_repeating_letter(s) lower_chars = s.downcase.chars char_count = lower_chars.each_with_object(Hash.new(0)) { |c, h| h[c] += 1 } s.chars.find { |char| char_count[char.downcase] == 1 } || "" end
测试输入'sTreSS'时,小写数组是['s','t','r','e','s','s'],统计后s出现3次,t/r/e各出现1次。遍历原字符时,第一个满足条件的是'T',正好符合题目要求。
内容的提问来源于stack exchange,提问作者Ouska
相关产品推荐
相关产品推荐

