【算法学习】1. 找单独的数

找单独的数

测试样例

样例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))。

异或运算通常用于查找数组中唯一的数字,例如在一个数组中,所有元素都成对出现,只有一个元素是单独出现的,异或操作可以找出那个元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值