leetcode 136. Single Number | XOR的巧妙运用

本文探讨了如何在整数数组中找到仅出现一次的元素,所有其他元素都恰好出现两次。提出了一个高效的解决方案,利用异或操作实现线性时间复杂度且无需额外内存。通过实例解释了异或操作的特点及应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

Given an array of integers, every element appears twice except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

My solution:None

题目要求O(n),以及不开辟更多内存.
- 关于时间复杂度
1. 对于A[i],同其余进行比较,遍历一次即O(n);
2. 对于A[j],也要像上述步骤一样进行,即使不再同A[i]进行比较,综合起来也是O(n2)的复杂度;
3. 考虑归并等适用于排序的算法思路,未果;
4. 但由3注意到可以先对A进行排序,快速排序在nlog(n)级别,排序之后相邻两两比较,复杂度在O(n),综合为nlog(n)
5. 通过Discuss才意识到通过位运算将神速! 这也是题目中给定的是twice,而不是3/4/5… 等,要从两两相消,单个的消不掉这个角度思考!!!

Discuss

int singleNumber(int A[], int n) {
    int result = 0;
    for (int i = 0; i<n; i++)
    {
        result ^=A[i];
    }
    return result;
}

known that A XOR A = 0
Exclusive disjunction is often used for bitwise operations.
Examples:
1 XOR 1 = 0
1 XOR 0 = 1
0 XOR 1 = 1
0 XOR 0 = 0

小结:
1. 1110 XOR 1001 = 0111 (this is equivalent to addition without carry).(注意到0+0=0,1+1=0的二进制法则刚好和xor一致)
2. 注意到 0 ^ N = N (N=0,1),不仅对于一个bit成立,故有0^A=A
3. A^B^A=B

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值