数组
描述:数组中有一个数字出现了一次,其他数字出现了两次,找出只出现一次的数字
思路异或操作:
array=[1,1,2,2,3]
ret=0
for item in array:
ret^=item
print(ret)
字符
和数组思路类似,不同的是需要将字符在unicode和ASCII编码之间转换,转成unicode编码使用ord(char),转成ASCII编码使用chr()
代码如下:
mystr=['a','a','b','b','c']
ret=0
for item in mystr:
ret^=ord(item)
print(chr(ret))
改进版本
有两个数字在数组中出现了一次,其余数字在数组中出现了两次:
思路1:
同样异或操作得到两个数异或的结果之后,根据异或结果中末尾第一次出现1作为基准,将数组分成两部分得到a b结果,算法如下:
ret=0
for item in array:
ret^=item
sep=1
#说明sep的结果这一位是0
while sep&ret==0:
sep=sep<<1
a=0
b=0
for item in array:
if item&sep:
a^=item
else:
b^=item
res=[a,b] if a<b else res=[b,a]
思路二:
将数组排序,判断相邻元素是否相同的方法:
array=sorted(array)
res=[]
i=0
l=len(array)
while(i<l-1):
if len(res)==2:
break
elif array[i]==array[i+1]:
i+=2
else:
res.append(array[i])
i+=1
if len(res)==1:
res.append(array[l-1])
return res