异或^符号的使用

简介: 异或^符号的使用

记录一道leetcode上的算法题精妙解法。

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

示例 1:

输入: [4,1,2,1,2]

输出: 4

题目其实非常简单,在此记录一种精妙解法,先把答案列出:

public int singleNumber(int[] nums) {
    int ans = nums[0];
    if (nums.length > 1) {
       for (int i = 1; i < nums.length; i++) {
          ans = ans ^ nums[i];
       }
     }
 return ans;
}

异或是一种位运算的符号,意思是二进制对应的位上相同为0 不同为1。  


比如: 1001


           1110


异或     0111


也就是9^14= 7


如果是两个相同的数字异或,那结果肯定是0,又因为a^b^c = a^c^b的交换原则。


所以可以把例题中的数字看为,1^1^2^2^4


有两个相同数字的都异或为0了,0异或一个值,根据上面的相同为0 不同为1,得到的是这个值本身。


所以把所有元素异或在一起后,最后得到的值就是只出现一次的元素。

目录
相关文章
|
1月前
学习使用按位异或 ^
学习使用按位异或 ^。
34 9
|
6月前
|
C语言
每天一道C语言编程(2^k进制数)
每天一道C语言编程(2^k进制数)
31 0
|
6月前
|
C++
(C++)只出现一次的数字II--异或
(C++)只出现一次的数字II--异或
46 0
|
6月前
|
C++
(C++)只出现一次的数字I--异或
(C++)只出现一次的数字I--异或
35 0
按位操作符:按位与 & 、按位或 | 、按位异或 ^ 、按位取反 ~
所有的按位操作符都是按二进制位补码操作
69 0
|
存储 C语言
有符号位与无符号位超超超详解!!!
有符号位与无符号位超超超详解!!!
278 0
有符号右移>>,无符号右移>>>
有符号右移>>,无符号右移>>>
132 0
【28. 最大异或对】
最大异或对就是在给定的数中,找到俩个数使得,这俩个数异或后的结果最大。 - 一般采用`暴力法`和`字典树`的方法。
151 0
【28. 最大异或对】