如何让这个 Javascript 字谜算法在 Ruby 中工作?

Posted

技术标签:

【中文标题】如何让这个 Javascript 字谜算法在 Ruby 中工作?【英文标题】:How to get this Javascript anagram algorithm to work in Ruby? 【发布时间】:2019-11-03 17:29:10 【问题描述】:

在我对所有算法和数据结构的研究中,我尝试在 Ruby 中完成我使用 javascript 学习的内容。两种语言都有自己的提升变量和处理真假的方式。

这个算法在 JS 中运行良好,但在 Ruby 中,当在哈希的存在上运行三元组时,我得到了经典的 undefined method+' for nil:NilClass`。

我已经尝试预先做一些条件来确保如果对象不存在,什么都不会通过。

这里是 Javascript 解决方案:

function validAnagram(str1, str2)
    if (str1.length !== str2.length) 
        return false;
    
  const strOneObj = ;
  const strTwoObj = ; 

  for (let char of str1) 
      strOneObj[char] = strOneObj[char] + 1 || 1;
    
   for (let char of str2) 
       strTwoObj[char] = strTwoObj[char] + 1 || 1;
    

  for (let values in strOneObj) 
    if (strOneObj[values] !== strTwoObj[values]) 
      return false; 
    
    return true; 
  



validAnagram('cinema', 'ice')

这是 Ruby 版本:

def valid_anagram(str1, str2)
  if str1.length != str2.length 
    false 
  else 
    str_one_hash = 
    str_two_hash = 

    str1.split('').each do |char|
      if str_one_hash == nil 
        str_one_hash[char] = 0 
      else 
        str_one_hash[char] += 1
      end 

    (str_one_hash.keys & str_one_hash.keys).each do |char, count| 
      if str_one_hash[char] != str_one_hash[char]
        false
      end 
    end 
  end   
    true 
end 

valid_anagram("cinema", "iceman")

简而言之:如何在漂亮的 Ruby 中使用它?

【问题讨论】:

【参考方案1】:

一种红宝石方法

def valid_anagram(str1, str2)
  if str1.length != str2.length 
    false 
  else 
    str_one_hash = str1.split('').map|char| [char, str1.count(char)].to_h
    str_two_hash = str2.split('').map|char| [char, str2.count(char)].to_h
    str_one_hash == str_two_hash
  end   
end

【讨论】:

【参考方案2】:

你离得太近了。

if str_one_hash == nil 是罪魁祸首。

if str_one_hash[char] == nil 是您正在寻找的。

注意:您可以通过调用 str_one_hash = Hash.new 0 将哈希的默认值设置为 0 — 消除 nil 检查。

【讨论】:

以上是关于如何让这个 Javascript 字谜算法在 Ruby 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 javascript 中创建一个单词的所有可能字谜的列表?

字谜算法返回重复值

在不到一秒的时间内执行一个字谜检查器算法

查找单词字谜数量的算法?

PHP中的字谜算法

将所有字谜组合在一起[关闭]