找到奇数整数(js基础)-逻辑



任务给定一个整数数组,找到出现奇数次的那个。

永远只有一个整数出现奇数次。

示例[0,1,0,1,0]应该返回0,因为它出现了3次(这是奇数(。[1,2,2,3,3,3,4,3,3,2,1]应该返回4,因为它出现了1次(这是奇数(。

我看到了这个解决方案,但我很难理解它工作的逻辑:

例如

function findOdd(arr) {
return arr.find((item) => arr.filter(el => el == item).length % 2)
}

console.log(findOdd([20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5])) // returns 5

如果这个数字一定是奇数,为什么不是。。。.length % 2 !== 0;我真的很感激任何帮助!谢谢:(

arr.filter(el => el == item).length % 2返回0或1。这已经足够好了,因为该值将被强制为布尔值,并且由于0是falsy,1是truthy,所以它具有预期效果。

注意,该算法具有O(n²(复杂度。可以更有效地做到这一点。

function findOdd(arr) {
return arr.reduce((a, b) => a ^ b);
}
console.log(findOdd([20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5])) // returns 5

这使用XOR。数组中的所有值都被异或在一起。它是基于对CCD_ 3的任何值的CCD_。和CCD_ 5。所以,如果我们有一个奇数的a,我们将得到a,否则为0。由于只有一个数字的出现是奇数,我们会这样找到它。0的特殊情况也适用。

因为filter返回的数组中确实包含满足条件的项。它返回过滤后的项目;过滤掉它们";。

这是一个快速高效的解决方案

  1. arr.find((item)=>{}这将循环遍历数组中的每个项,并返回第一个满足的值,其中我们返回true;

  2. arr.filter(el => el == item)这将再次循环通过相同的数组,并返回重复元素的数组例如,如果arr=[1,1,2,1,3],则arr.filter(el => el == 1)将返回[1,1,1]

  3. arr.filter(el => el == item).length % 2这将返回重复元素的结果数组除以2的提醒,该结果数组应为0或1

  4. 对于javascript0 == false1 == true;因此,当find循环从滤波器中找到1时,它将返回该值;

最新更新