这次是数组中有2个不同的数字,其他都成对,要求出这2个数字。
有了single number I的经验,直接借用快排,修改了下数字判断的逻辑很快就鼓捣出来了,但这样过了没啥意义,于是自己借鉴异或的经验想了半天也想不出怎么从混合的结果中分离出a、b,于是网搜。原来混合的结果mix是用来分类的,求出mix最后一个1的位置然后将数组根据此位置为0或1分为两组,a、b一定分别在两组中,因为mix的末位1表明a和b在此位一个是1一个是0,所以据此分为两组后再分别异或两组成员,则最后a、b沉淀出来。还是有点妙的。
分类法如下,排序的就不贴了:
int* singleNumber(int* nums, int numsSize, int* returnSize) {
int *result = (int *)calloc(2, sizeof(int));
*returnSize = 2;
int a = 0, b = 0;
int r = 0, idx = 0;
for (int i = 0; i < numsSize; i++)
r = r ^ nums[i];
while (true) {
if (r & 0x01)
break;
r = r >> 1;
idx++;
}
int key = 1;
while (idx > 0) {
key = key << 1;
idx--;
}
for (int i = 0; i < numsSize; i++) {
if (nums[i] & key) {
a = a ^ nums[i];
}
else
b = b ^ nums[i];
}
result[0] = a, result[1] = b;
return result;
}