如何让这个 Javascript 字谜算法在 Ruby 中工作?
How to get this Javascript anagram algorithm to work in Ruby?
在我对所有算法和数据结构的研究中,我试图在 Ruby 中做我使用 Javascript 学到的东西。两种语言都有自己的提升变量和处理 truthy/falsey 的方式。
此算法在 JS 中运行良好,但在 Ruby 中,当 运行 存在三元时,我得到了 nil:NilClass` 的经典 undefined method
+'一个哈希。
我已经尝试预先做一些条件判断,以确保如果对象不存在,则不会通过任何操作。
这是 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 中使用它?
你太接近了。
if str_one_hash == nil
是罪魁祸首。
if str_one_hash[char] == nil
就是您要找的。
注意:您可以通过调用 str_one_hash = Hash.new { 0 }
将哈希的默认值设置为 0 — 消除 nil 检查。
一种ruby的方法
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
在我对所有算法和数据结构的研究中,我试图在 Ruby 中做我使用 Javascript 学到的东西。两种语言都有自己的提升变量和处理 truthy/falsey 的方式。
此算法在 JS 中运行良好,但在 Ruby 中,当 运行 存在三元时,我得到了 nil:NilClass` 的经典 undefined method
+'一个哈希。
我已经尝试预先做一些条件判断,以确保如果对象不存在,则不会通过任何操作。
这是 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 中使用它?
你太接近了。
if str_one_hash == nil
是罪魁祸首。
if str_one_hash[char] == nil
就是您要找的。
注意:您可以通过调用 str_one_hash = Hash.new { 0 }
将哈希的默认值设置为 0 — 消除 nil 检查。
一种ruby的方法
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