def anagram(s)
counter = 0
if s.length.even?
splitter = s.chars.each_slice(s.length / 2).map(&:join)
left = splitter[0]
right = splitter[1]
return 0 if right == left
counter = left.length
leftchar = left.split
rightchar = right.split
rightchar.each do |n|
leftchar.each do |m|
counter -= 1 while n == m
end
end
counter
else
return -1
end
end
[您好,我正在尝试解决红宝石Hackerank中的问题。该程序是返回已拆分的字符串中要更改的字符数,以便与其他字符串匹配。那就是说这个词本身不是一个字谜。
到目前为止:
这就是我的逻辑。但是我似乎错过了一些东西。我有什么建议和建议吗?谢谢。
def min_nbr_swaps(str)
return -1 unless str.size.even?
half = str.size/2
str1 = str[0,half]
str2 = str[half,half]
h = str2.each_char.with_object(Hash.new(0)) { |c,h| h[c] += 1 }
str1.each_char.count do |c|
case h[c]
when 0
true
else
h[c] -= 1
false
end
end
end
min_nbr_swaps('aaabbb') #=> 3 min_nbr_swaps('ab') #=> 1 min_nbr_swaps('abc') #=> -1 min_nbr_swaps('mnop') #=> 2 min_nbr_swaps('xyyx') #=> 0 min_nbr_swaps('xaxbbbxx') #=> 1
步骤如下。
str = 'xaxbbbxx'
str.size.even? #=> 8.even? => true, so do not return -1 half = str.size/2 #=> 4 str1 = str[0,half] #=> "xaxb" str2 = str[half,half] #=> "bbxx" h = str2.each_char.with_object(Hash.new(0)) { |c,h| h[c] += 1 } #=> {"b"=>2, "x"=>2} enum = str1.each_char #=> #<Enumerator: "xaxb":each_char>
我们现在使用方法Enumerable#count确定str1
中需要修改的字符数。
enum.count do |c| case h[c] when 0 true else h[c] -= 1 false end end #=> 4
通过count
块的第一个元素是str1[0] #=> 'x'
。
c = 'x'
作为h['x'] #=> 2
,执行case
语句
h['x'] -= 1
并返回false
,表示不需要更改x
。现在h #=> {"b"=>2, "x"=>1}
接下来,为块变量分配值
str1[1] #=> 'a'
:
c = 'a'
作为h['a'] #=> 0
,case
语句返回true
,这意味着需要更改a
。这里h[a]
返回默认值
其余计算相似,均返回0
,因为h
没有键a
。h
不变。false
。count
返回1
,因为该块仅对true
中1
个字符中的4
个返回str1
。