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

时间:2020-01-28 20:02:28

标签: ruby anagram

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。
  • 接下来,在分割字符串之后,我试图检查是否可以 是出现在右边字符串中而不出现在左边字符串中的字符。而且由于我的程序是返回字符数 需要更改,对于左侧礼物中找到的每个字符 在右边,我减去左边的长度。

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

1 个答案:

答案 0 :(得分: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 }

这使用Hash::new的形式,该形式接受称为默认值的参数。这就是说,当Ruby的解析器将h[c] += 1扩展到

时,
h[c] = h[c] + 1
如果h[c]没有键h,则右边的

h返回c的默认值0。例如,当h为空时,

h['x'] = h['x'] + 1 #=> 0 + 1 => 1
h['x'] = h['x'] + 1 #=> 1 + 1 => 2

h在第一个表达式中没有键'x',因此右侧的h[c]返回默认值0,而h则返回在第二个表达式中具有该键,因此默认值不适用。

继续

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'] #=> 2case语句执行

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没有键ah不变。

其余计算相似,均返回falsecount返回1,因为该块仅对true1个字符中的4个返回str1