【问题标题】:Find the odd integer (js fundamentals) - logic求奇数(js 基础)——逻辑
【发布时间】:2022-01-18 13:17:41
【问题描述】:

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

总是只有一个整数出现奇数次。

示例 [0,1,0,1,0] 应该返回 0,因为它出现了 3 次(这是奇数)。 [1,2,2,3,3,3,4,3,3,3,2,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; 我真的很感激任何帮助!谢谢:)

【问题讨论】:

  • 在 JS 0 == false(大致相等)中,非 0 数是“真实的”(在布尔上下文中被视为真实)
  • 它获取您的数组,然后将其过滤为仅包含“相同”,然后检查长度(出现次数)并检查这是否是奇数时间。所有包裹在find() 中的东西都只会返回一次,它第一次验证true... 所以给定示例数组,find 首先验证20 是否出现奇数次, - 它没有,然后检查 1,然后检查 -1,然后检查 2,……等等,直到达到 5,验证为真,然后find() 返回数组的那个元素;)

标签: javascript arr


【解决方案1】:

arr.filter(el => el == item).length % 2 返回 0 或 1。这已经足够了,因为该值将被强制转换为布尔值,并且由于 0 为假,1 为真,因此具有预期的效果。

请注意,此算法的复杂度为 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。数组中的所有值都被异或在一起。它基于a ^ a == 0a 的任何值的考虑。和a ^ 0 == a。因此,如果我们有一个奇数a,我们将得到a,否则为0。由于只有一个数字的出现是奇数,我们会这样找到它。 0 的特殊情况也可以。

【讨论】:

    【解决方案2】:

    因为filter 返回的数组确实包含满足条件的项目。它返回过滤后的项目,它不会“过滤掉它们”。

    【讨论】:

      【解决方案3】:

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

      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. 对于 javascript 0 == false1 == true;因此,当查找循环从过滤器中找到 1 时,它将返回该值;

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多