题目一:
1.题目描述
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。
找到所有出现两次的元素。
你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?
示例:
输入:
[4,3,2,7,8,2,3,1]输出:
[2,3]
2.解题思路
遍历数组中的每一个数,将当前数的绝对值作为索引,将索引对应的数取反,如果这个数是正数,则说明原数组中的这个数重复了
3.代码实现
class Solution(object):
def findDuplicates(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
res=[]
for i in range(len(nums)):
index=abs(nums[i])-1
nums[index]=-nums[index]
if nums[index]>0:
res.append(abs(nums[i]))
return res
题目二:
1.题目描述
将题目改成:寻找数组中唯一出现两次的数
2.解题思路
这种方法主要使用到了位运算,其实位运算有很多有用的性质,只是为人们所不熟悉罢了。
这里主要用到的是异或运算的性质,a^a^b=b,以及异或运算满足结合律和交换律
将1001个数进行异或,结果与1到1000异或的结果进行异或,得到的值即为所求。
3.代码实现
class Solution(object):
def findDuplicates(self, nums):
res = 1
n = len(nums)
for i in range(2,n+1):
res = res^i
for num in nums:
res = res^num
return res