AI刷题-找单独的数

93 阅读3分钟

题目描述

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

要求:

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

测试样例

样例1:

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

样例2:

输入:cards = [0, 1, 0, 1, 2]
输出:2
解释:数字 2 只出现一次,是独特的卡片。

样例3:

输入:cards = [7, 3, 3, 7, 10]
输出:10
解释:10 是班级中唯一一个不重复的数字卡片。

JavaScript

function solution(cards) {
    let result = 0;
    cards.forEach(item => {
        result ^= item;
    });

    return result;
}

知识点补充-按位异或

运算符 - 按位异或^

按位异或^】在两个操作数有且仅有一个对应的二进制位为 1 时,该位的结果值为 1。语法:a ^ b

操作数被转换为 32 位整数并由一系列二进制位(0 和 1)表示。超过 32 位的数字会丢弃其最高有效位。例如,以下超过 32 位的整数将被转换为 32 位整数:

Before: 11100110111110100000000000000110000000000001
After:              10100000000000000110000000000001

第一个操作数中的每个位都与第二个操作数中的相应位配对:第一位第一位第二位第二位,以此类推。运算符【^】应用于每一对位,结果按位构造。

异或运算的真值表为:

aba ^ b
000
011
101
110

将任意数字 x 与 0 进行按位异或运算得到 x

     9 (十进制) = 00000000000000000000000000001001 (二进制)
    14 (十进制) = 00000000000000000000000000001110 (二进制)
                -----------------------------------
14 ^ 9 (十进制) = 00000000000000000000000000000111 (二进制) = 7 (十进制)

操作符 - 按位异或赋值^=

按位异或赋值^=】使用二进制表示操作数,进行一次按位异或操作并赋值。语法:a ^= b,等同于:a = a ^ b

根据以上异或运算的真值表可知,任意数字与 0 进行按位异或运算都会得到该数字,相同操作数进行按位异或运算得到 0;所以 result 初始值设为 0,遍历数组,将数组中每一项按位异或赋值给 result,最终结果即是数组中唯一不重复的值。