javascript - 为什么我的代码在比较 2 个数组时只返回一次 true?
问题描述
我正在尝试解决代码战问题,但我似乎无法让我的代码正常工作。
a1 = [121, 144, 19, 161, 19, 144, 19, 11];
a2 = [11*11, 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 19*19];
Test.assertEquals(comp(a1, a2), true);
function comp(array1, array2){
let newArray1Squared = [];
let newArray1 = a1.sort(function(a, b){
return a - b;
});
newArray1.map(function(num){
newArray1Squared.push(num*num);
});
let newArray2 = a2.sort(function(a, b){
return a - b;
});
for (let i = 0; i<newArray1Squared.length; i++){
if (newArray1Squared[i] === newArray2[i]){
return true;
} else {
return false;
}
}
}
到目前为止,这是我的代码。问题是:
给定两个数组 a 和 b,编写一个函数 comp(a, b)(Clojure 中的 compSame(a, b))检查这两个数组是否具有“相同”元素,是否具有相同的多重性。这里的“相同”意味着 b 中的元素是正方形中的元素,无论顺序如何。
示例 有效数组
a = [121, 144, 19, 161, 19, 144, 19, 11]
b = [121, 14641, 20736, 361, 25921, 361, 20736, 361]
comp(a, b) 返回真,因为在 b 中,121 是 11 的平方,14641 是 121 的平方,20736 是 144 的平方,361 是 19 的平方,25921 是 161 的平方,以此类推。如果我们用正方形来写 b 的元素,那就很明显了:
解决方案
您可以通过使用对象将每个值的出现计数存储在数组1中来解决它,然后遍历数组2并减少对象中的出现计数,最后遍历对象以查看所有值是否为0。
检查以下:
var a1 = [121, 144, 19, 161, 19, 144, 19, 11];
var a2 = [11*11, 121*121, 144*144, 19*19, 161*161, 19*19, 144*144, 19*19];
function comp(array1, array2) {
var temp = {};
if(array1.length != array2.length)
return false;
for(let a of array1) {
if(temp[a]) {
temp[a]++;
} else {
temp[a] = 1;
}
}
for(let a of array2) {
let sqrt = Math.sqrt(a);
if(temp[sqrt] && temp[sqrt] > 0) {
temp[sqrt]--;
} else {
return false;
}
}
var keys = Object.keys(temp);
for(let key of keys) {
if(temp[key] != 0)
return false;
}
return true;
}
console.log(comp(a1, a2));
推荐阅读
- flutter - AnimatedList 中的滑块值错误
- swift - 如何从 Swift 中的 Pod 模块访问目标 c 方法
- python - 想在我的 Python 代码中添加多处理
- c++ - btHeightfieldTerrainShape 构造函数参数不明确
- java - 如何懒惰地评估嵌套的 flatMap
- mysql - Spring Data JPA Java - 如何从查询中获取最后10条记录并按列排序
- r - 识别 group_by 和 mutate 中的值
- typescript - Typescript 从现有记录创建新记录?
- python - 如何检查密码要求?
- laravel - 具有多个外键的一对多关系 laravel