寻找独一无二的它

16 阅读2分钟

问题描述

在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。

要求:

  1. 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
  2. 尽量减少额外空间的使用,以体现你的算法优化能力。

测试样例

样例1:

输入:cards = [1, 1, 2, 2, 3, 3, 4, 5, 5]
输出:4
解释:拿到数字 4 的同学是唯一一个没有配对的。

function solution(cards) {

    //方法1:

    //初始化一个变量 result 为 0。
    var result = 0
    for (let i = 0; i < cards.length; i++) {
        const element = cards[i];
        //跟每一个元素进行异或运算
        result = result ^ element
        console.log('每一次的亦或结果:', result);
    }

    //方法2:

    // let result = cards.reduce((acc, num) => acc ^ num)
    return result;
}


//十进制 转 二进制

function decimalToBinary(decimal) {
    return decimal.toString(2);
}


function main() {

    let ff = solution([1, 1, 10, 10 , 6, 7, 8, 8, 7, 6, 2, 2, 3, 3, 4, 5, 5])
    console.log(ff);

    //异或运算(二进制运算)
    let n1 = 1
    let n2 = 5
    //console.log(n1 ^ n2);

    //5的二进制
    //console.log(decimalToBinary(5));
}

main();
4
4
101

结果:

  • 时间复杂度O(n)
  • 空间复杂度O(1)
  • 正确找出唯一出现的数字

关键点:

  • 异或运算的性质:相同数字异或结果为0,任何数字与0异或结果为它本身。因此,所有成对出现的数字会互相抵消,最终剩下的就是唯一不重复的数字(异或运算(XOR)是按位进行的二进制运算)。
  • 时间复杂度:O(n),因为你只遍历了一次数组。
  • 空间复杂度:O(1),只使用了常数级别的额外空间。