//方法2-异或 int* singleNumbers(int* nums, int numsSize, int* returnSize) { //1.全部异或在一起 int i = 0; int k = 0; for (i = 0; i < numsSize; i++) { k ^= nums[i]; //4^1^4^6 = 1^6 } //2.判断k的二进制第几位是1 intset = 0; for (i = 0; i < 32; i++) { if (((k >> i) & 1) == 1)//注意操作符优先级 { set = i;//第i位为1 break; } } //3.以第set位为1进行分组,可以将这两个数分开 int n = 0; int m = 0; for (i = 0; i < numsSize; i++) { if (((nums[i] >> set) & 1) == 1) { n ^= nums[i]; } else { m ^= nums[i]; } }
int* result = (int*)calloc(2, sizeof(int)); //返回的数组必须用动态内存管理来创建 result[0] = n; result[1] = m; *returnSize = 2; return result; }
classSolution { public: vector<int> singleNumber(vector<int>& nums){ //1.全部异或在一起 int numsSize=nums.size(); int i = 0; int k = 0; for (i = 0; i < numsSize; i++) { k ^= nums[i]; //4^1^4^6 = 1^6 } //2.判断k的二进制第几位是1 int set = 0; for (i = 0; i < 32; i++) { if (((k >> i) & 1) == 1)//注意操作符优先级 { set = i;//第i位为1 break; } } //3.以第set位为1进行分组,可以将这两个数分开 int n = 0; int m = 0; for (i = 0; i < numsSize; i++) { if (((nums[i] >> set) & 1) == 1) { n ^= nums[i]; } else { m ^= nums[i]; } }