异或^符号的使用

简介: 异或^符号的使用

记录一道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,得到的是这个值本身。


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

目录
相关文章
【Leetcode -231. 2的幂 -242.有效的字母异位词 -258.各位相加】
【Leetcode -231. 2的幂 -242.有效的字母异位词 -258.各位相加】
42 0
|
2月前
学习使用按位异或 ^
学习使用按位异或 ^。
36 9
|
7月前
|
C语言
每天一道C语言编程(2^k进制数)
每天一道C语言编程(2^k进制数)
34 0
|
7月前
|
C++
(C++)只出现一次的数字I--异或
(C++)只出现一次的数字I--异或
36 0
|
7月前
|
C++
(C++)只出现一次的数字II--异或
(C++)只出现一次的数字II--异或
50 0
|
算法 C++
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
剑指offer(C++)-JZ16:数值的整数次方(算法-位运算)
按位操作符:按位与 & 、按位或 | 、按位异或 ^ 、按位取反 ~
所有的按位操作符都是按二进制位补码操作
73 0
|
存储 C语言
有符号位与无符号位超超超详解!!!
有符号位与无符号位超超超详解!!!
286 0