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

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. 先把整个字符串转成小写数组,统计每个小写字符的出现次数,得到一个键为小写字符、值为出现次数的哈希。
  2. 遍历原字符串的每一个字符,对每个字符转小写后去哈希里查次数,找到第一个次数为1的原字符——这样既保证了大小写不敏感的统计,又能保留原字符的正确大小写。
  3. 如果遍历完没找到,返回空字符串。

兼容低版本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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 23:10:31