题目:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
思考一:创建一个集合,Python中集合不能重复,第一次见到的数字我都加进集合中,第二次见到就从集合中把她删除,最后集合中就只剩单独的一个数字
class Solution:
def singleNumber(self, nums: List[int]) -> int:
qq = set()
for i in nums:
if i not in qq:
qq.add(i)
else:
qq.remove(i)
qq= list(qq)
return qq[0]
提交结果:思考二:遍历一个数就把那个数删除并在列表中寻找,如果没有说明这个数是唯一的,遍历结束。
class Solution:
def singleNumber(self, nums: List[int]) -> int:
nums.sort()
while True:
p = nums.pop(0)
if (p not in nums):
return p
else:
nums.remove(p)
运行结果:
同样内存消耗少,但是时间却比上一个多多了
别人的思考和代码:
1、
使用异或运算,将所有值进行异或
异或运算,相异为真,相同为假,所以 a^a = 0 ;0^a = a
因为异或运算 满足交换律 a^b^a = a^a^b = b 所以数组经过异或运算,单独的值就剩下了
class Solution {
public int singleNumber(int[] nums) {
int reduce = 0;
for (int num : nums) {
reduce = reduce ^ num;
}
return reduce;
}
}
2、位运算解决
public int singleNumber(int nums[]) {
int result = 0;
for (int i = 0; i < nums.length; i++)
result ^= nums[i];
return result;
}
3、使用集合set解决
public int singleNumber(int[] nums) {
Set<Integer> set = new HashSet<>();
for (int num : nums) {
if (!set.add(num)) {
//如果添加失败,说明这个值
//在集合Set中存在,我们要
//把他给移除掉
set.remove(num);
}
}
//最终集合Set中只有一个元素,我们直接返回
return (int) set.toArray()[0];
}
3、奇数位置与奇数+1位置的元素不相同,则证明奇数位之前存在只出现一次的数字
class Solution:
def singleNumber(self, nums: List[int]) -> int:
nums.sort()
for i in range(0,len(nums),2):
if(i == len(nums)-1) or nums[i] != nums[i+1]:
return nums[i]