建站公司 商城,福建省网站建设方案书,李勇seo的博客,wordpress播放视频题目描述#xff1a;剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣#xff08;LeetCode#xff09; 一个整型数组 nums 里除两个数字之外#xff0c;其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n)#xff0c;空间复杂度是O(1)。 示…题目描述剑指 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;
} 本次内容到此结束了如果你觉得这篇博客对你有帮助的话 希望你能够给我点个赞鼓励一下我。感谢感谢……