转载:https://blog.csdn.net/xy913741894/article/details/52145043
只出现一次的数字
题目描述:
给定一个整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
思路:
利用异或的性质:一个数字异或它自己结果为0,异或0结果为它自己即 a^a=0,a^0=a,且异或满足 a^b^c=a^(b^c) 。
2 ^ 2 = 0
2 ^ 2 ^ 3 = 3
2 ^ 3 ^ 2 = 3
public int singleNumber(int[] nums) {
int result = nums[0];
for (int i = 1; i < nums.length; i++) {
result^=nums[i];
}
return result;
}
相关题目:
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次,请找出这两个数字。
思路:
在上题的基础上,我们不妨可以把原数组分为两个子数组。在每个子数组中,包含一个只出现一次的数字,而其它数字都出现两次。如果能够这样拆分原数组,按照前面的办法就是分别求出这两个只出现一次的数字了。
我们还是设置一个ret异或每个数组元素,由于其它数字都出现了两次,在异或中全部抵消为0,那么最终得到的结果就是两个只出现一次的数字的异或结果ret。由于这两个数字不一样,那么这个异或结果ret肯定不为0 ,即这个结果数字的二进制表示中至少就有一位为1 。我们在结果数字中找到第一个为1 的位的位置,记为第pos 位。我们以第pos 位是不是1 为标准把原数组中的数字分成两个子数组,第一个子数组中每个数字的第pos 位都为1 ,而第二个子数组的每个数字的第pos位都为0 。最后将子数组按照之前方法就可以分别得到各自的唯一数字。
网友评论