给定一个整数数组,除了某个元素外其余元素均出现两次。请找出这个只出现一次的元素。
备注:
你的算法应该是一个线性时间复杂度。 你可以不用额外空间来实现它吗?
1.利用异或的特点,
自己与自己异或为0:a ⊕ a = 0
结合律:a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c:
所以题目可以简化为:(a1⊕a1⊕a2⊕a2⊕....)⊕a单=0⊕a单=a单
class Solution:
def singleNumber(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
ans=0
for item in nums:
ans^=item
return ans
2.异或总结:
异或也叫半加运算,其运算法则相当于不带进位的二进制加法:二进制下用1表示真,0表示假,则异或的运算法则为:0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1),这些法则与加法是相同的,只是不带进位。
1. a ⊕ a = 0 #自己与自己异或为0
2. a ⊕ b = b ⊕ a #满足交换律
3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;#满足结合律
4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
5. a ⊕ b ⊕ a = b.#由1和3可以推出来
3.异或运算的应用
1)指定位取反:与0异或不变,与1异或取反;
假设有01111010,想使其低4位翻转,即1变为0,0变为1。可以将它与00001111进行异或运算
2)交换两个值,不用临时变量
将a和b的值互换,可以用以下赋值语句实现:
a = a∧b;
b = b∧a;
a = a∧b;
##
变型题目:
一个数组存放若干整数,一个数出现奇数次,其余数均出现偶数次,找出这个出现奇数次的数?
一个整型数组里除了两个数字之外,其他的数字都出现了两次?