12行x>b&&e==0
是==不是=
另外25行也应该是类似的问题,只是你的图看不到25行的代码
首先12行
//不是赋值=号,是双等于,
//还有if的地方加上大括号吧,
/#还有你25行出错了,图片上我看不到
if(x>b&&e==0)
{
}
不知道你这个问题是否已经解决, 如果还没有解决的话:int* singleNumber2(int* nums, int numsSize, int* returnSize){
if(NULL == nums || numsSize == 0){
printf("singleNumber param error\n");
*returnSize = 0;
return NULL;
}
int * p = NULL;
int i = 0, k = 0;
int bitmask = 0;
int diff = 0;
int x = 0;
p = (int *)malloc(2 * sizeof(int));
if(NULL == p){
printf("singleNumber alloc error\n");
*returnSize = 0;
return NULL;
}
/*
* 出现两次的数,被从bitmask中去掉了,出现一次的保存到了bitmask中
* 其实bitmask是数字的特征值,出现两个数字的会通过异或把特征值去除,
* 剩下的就是单独出现的两个数字的特征值。
* 如果单独出现的两个数字在某位上都是1的怎么处理呢?那不是情况了吗?
* 这就对了,相同为的特征值被抵消掉了,但一定会有不同的为,有特征值被保留下来,
* 否则就成相同的两个数字了
*/
for(i = 0; i < numsSize; i++){
bitmask ^= nums[i];
}
/*取得最右侧的1,到diff中*/
diff = bitmask & (-bitmask);
/*
* 这是的diff只有第一个出现一次的数 X 对应的bit位置
* 但是可能有很多的数,在改bit位上为1;
* 但是 x 通过不断的异或,把其他出现两次的数字去掉,
* 最后就剩下了只出现一次的且该位为1的 X
*/
for(i = 0; i < numsSize; i++){
if(0 != (diff & nums[i])){
x ^= nums[i];
}
}
p[k++] = x;
/*从bitmask中分离出x,就剩下了y*/
p[k++] = bitmask ^ x;
out:
*returnSize = k;
return p;
}
void testsingleNumber(void){
printf("\n************ testsingleNumber ************ \n");
int nums[] = {1,2,1,3,2,5};
int numsSize = sizeof(nums) / sizeof(int);
int returnSize = 0;
int * p= NULL;
int i = 0;
/*testcase 1*/
p = singleNumber(nums, numsSize, &returnSize);
if(NULL != p){
printf("\t returnSize = %d \n",returnSize);
printf("\t [ ");
for(i = 0; i < returnSize; i++){
printf(" %d ", p[i]);
}
printf(" ] \n");
free(p);
p = NULL;
}
/*testcase 2*/
p = singleNumber2(nums, numsSize, &returnSize);
if(NULL != p){
printf("\t returnSize = %d \n",returnSize);
printf("\t [ ");
for(i = 0; i < returnSize; i++){
printf(" %d ", p[i]);
}
printf(" ] \n");
free(p);
p = NULL;
}
return;
}
int main(int argc, char ** argv){
testsingleNumber();
}