问题描述
在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。
要求:
- 设计一个算法,使其时间复杂度为 O(n),其中 n 是班级的人数。
- 尽量减少额外空间的使用,以体现你的算法优化能力。
测试样例
样例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),只使用了常数级别的额外空间。