微信网站公众平台惠州seo按天计费
题目描述:剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣(LeetCode)
一个整型数组
nums
里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
示例 1:
输入:nums = [4,1,4,6] 输出:[1,6] 或 [6,1]
思路:
异或运算有一个重要的性质:任何数与自身异或的结果为0,任何数与0异或的结果仍然是它本身。
- 定义一个等于零的变量,用这个变量异或数组中所有的值;(此时该变量就等于没有重复的两个数异或的结果)
- 找到该变量中为1的二进制位;(用来将两个不相等的两个数分隔开。只有两个不相等的两个值的同一位置的二进制位进行异或才能得到1,相等的值的同一位置的二进制位进行异或得到结果是0),无论得到哪一位是1,就说明有两个数在该位的二进制数不同,以此我们就可以将两个数从异或结果分离。
- 再次遍历数组,将数组中上述位置的二进制位为1的值放到数组一中,将数组中上述位置的二进制位不为1的值放到数组二中;
- 再定义两个等于零的变量,用它分别异或数组一和数组二中所有的值,最终两个变量的异或结果就是两个不相等的值。
代码:
int* singleNumbers(int* nums, int numsSize, int* returnSize)
{int temp = 0;for (int i = 0; i < numsSize; i++){temp ^= nums[i];}int div = 1;while ((temp & div) == 0){div <<= 1;}int num1 = 0;int num2 = 0;for (int i = 0; i < numsSize; i++){if ((nums[i] & div) == div){num1 ^= nums[i];}else{num2 ^= nums[i];}}nums[0] = num1;nums[1] = num2;*returnSize = 2;return nums;
}
本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……