找单独的数
测试样例
样例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 是班级中唯一一个不重复的数字卡片。
约束条件
- 1 ≤ cards.length ≤ 1001
- 0 ≤ cards[i] ≤ 1000
- 班级人数为奇数
- 除了一个数字卡片只出现一次外,其余每个数字卡片都恰好出现两次
代码
function solution(cards) {
// Edit your code here
let x = 0
for(let i = 0;i<cards.length;i++){
x ^= cards[i]
}
return x;
}
function main() {
// Add your test cases here
console.log(solution([1, 1, 2, 2, 3, 3, 4, 5, 5]) === 4);
console.log(solution([0, 1, 0, 1, 2]) === 2);
}
main();
代码解释
这段代码的目的是通过异或运算来解决一个问题。让我们逐行分析这个方法:
1. 初始化 x 为 0
let x = 0;
这里创建一个名为 x 的变量,并将其初始化为 0。这个变量 x 会在之后用于存储每次异或操作的结果。
2. 遍历数组 cards
for (let i = 0; i <= cards.length; i++) {
x ^= cards[i];
}
这个 for 循环遍历 cards 数组。循环的条件是 i <= cards.length,但是有一个问题:i 从 0 开始,而 cards.length 是数组的长度,因此循环的条件应该是 i < cards.length 而不是 i <= cards.length。i <= cards.length 会导致数组下标越界(即尝试访问 cards[cards.length]),这会抛出一个错误。
3. 异或运算
x ^= cards[i];
在循环中,每次都会执行 x ^= cards[i],即将 x 与 cards[i] 进行异或运算。异或(^)是一种常见的按位操作,具有以下特点:
• 任何数与 0 异或,结果为该数本身(a ^ 0 = a)。
• 任何数与其自身异或,结果为 0(a ^ a = 0)。
• 异或运算是可交换和结合的(即 a ^ b = b ^ a,(a ^ b) ^ c = a ^ (b ^ c))。
异或运算通常用于查找数组中唯一的数字,例如在一个数组中,所有元素都成对出现,只有一个元素是单独出现的,异或操作可以找出那个元素。