解决红宝石中的Hackerank字谜解决方案

问题描述 投票:1回答:1
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中的问题。该程序是返回已拆分的字符串中要更改的字符数,以便与其他字符串匹配。那就是说这个词本身不是一个字谜。

到目前为止:

  • 我先检查字符串是否是偶数,然后再分割字符串一分为二,否则,程序应返回-1。
  • 接下来,在分割字符串之后,我正在尝试检查是否可以是出现在右边字符串中而不出现在左边字符串中的字符。而且由于我的程序是返回字符数需要更改,对于左侧礼物中找到的每个字符在右边,我减去左边的长度。

这就是我的逻辑。但是我似乎错过了一些东西。我有什么建议和建议吗?谢谢。

ruby anagram
1个回答
1
投票
执行此操作的许多方法之一是以下方法。

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'] #=> 0case语句返回true,这意味着需要更改a。这里h[a]返回

默认值 0,因为h没有键ah不变。

其余计算相似,均返回falsecount返回1,因为该块仅对true1个字符中的4个返回str1
© www.soinside.com 2019 - 2024. All rights reserved.