我正在尝试检查两个整数是否包含相同的数字集合。
equivalent(123, 321) // -> true
equivalent(413, 1453) // -> false
equivalent(2002, 2200) // -> true
equivalent(542, 545) // -> false
我开始使用以下功能:
function equivalent(a,b) {
let stringA = a.toString().match(/[1-9]/g);
let stringB = b.toString().match(/[1-9]/g);
}
我不知道是否使用哈希映射来映射每个数字的出现并递增,但是我无法检查两个对象是否彼此相等。
哪种方法最优化(在空间/时间复杂度方面)以及哪种方法最容易读取或两者兼而有之?感谢。
编辑:抱歉没有详细说明我的问题。我想检查两个整数是否包含相同的数字和相同数量的数字。
答案 0 :(得分:2)
使用一个简单的循环并使用String#replace
从第二个字符串中删除每个字符,然后检查第二个字符串是否为空(空意味着两个字符包含相同的数字)。
console.log(
equivalent(123, 321), // -> true
equivalent(413, 1453), // -> false
equivalent(2002, 2200) // -> true
);
function equivalent(a, b) {
// convert into string
a = a.toString();
b = b.toString();
// iterate over each character
for (var i = 0; i < a.length; i++)
// replace each character from second string
b = b.replace(a[i], '');
// finally check second string is empty
return b == '';
}
答案 1 :(得分:1)
您可以对数字进行排序并比较连接的字符串。
function equivalent(a, b) {
return [...a.toString()].sort().join('') === [...b.toString()].sort().join('');
}
console.log(equivalent(123, 321));
console.log(equivalent(413, 1453));
console.log(equivalent(2002, 2200));
&#13;
使用哈希表
function equivalent(a, b) {
var hash = Object.create(null);
[...a.toString()].forEach(a => hash[a] = (hash[a] || 0) + 1);
[...b.toString()].forEach(b => hash[b] = (hash[b] || 0) - 1);
return Object.keys(hash).every(k => !hash[k]);
}
console.log(equivalent(123, 321));
console.log(equivalent(413, 1453));
console.log(equivalent(2002, 2200));
&#13;
答案 2 :(得分:0)
转换为字符串,拆分,排序,组合并比较。
function equivalent(a, b) {
return a.toString().split("").sort().join("") === b.toString().split("").sort().join("");
}
console.log(equivalent(123, 321));
console.log(equivalent(413, 1453));
console.log(equivalent(2002, 2200));
&#13;
可以添加长度检查,以便不需要进行其他处理。