一、题目
二、解题思路
1、思路一
计数法:通过题目我们知道除了某个元素其他的元素都有重复值,也就是说元素总数为奇数n,去除重复值的话,元素总数x为(n-1)/2+1,我们可以初始化两个长度为x的数组,一个数组记录唯一值,另一个记录每个唯一值对应的出现次数,出现次数为1,就是我们最后要找的值。
2、思路二
异或法:c语言中,两个相同值进行异或运算返回0,两个不同的值进行异或运算返回两数之和,当两个相同进行异或之后,再和一个不同值进行异或运算,返回不同值。情况举例如下:
(1)a ^ a 返回0
(2)a ^ b ^ b 返回a
(3)a ^ b 返回a+b
三、虚机测试代码
#include <stdio.h>
#include <stdlib.h>
#define SIZE 5
/**
*异或操作符:^
*a^a 返回0
*a^b^b 返回a
*a^b 返回a+b
*/
void main()
{
int singleNumber(int* nums, int numsSize);
int singleNumber_v1(int* nums, int numsSize);
int test_array[SIZE] = {4,1,2,1,2};
int res,res1;
res = singleNumber(test_array , SIZE);
res1 = singleNumber_v1(test_array , SIZE);
printf("res : %d\n",res);
printf("res1 : %d\n",res1);
printf("test : %d %d\n",6^8,7^7);
}
void PrintfArray(int* array , int size)
{
int i;
for(i = 0;i < size;i++)
{
printf("%4d",array[i]);
}
printf("\n");
}
int singleNumber(int* nums, int numsSize)
{
int size = (numsSize - 1) / 2 + 1;
int *array_val = malloc(sizeof(int) * size);
int *array_cnt = malloc(sizeof(int) * size);
int i,j;
int res;
for(i = 0;i < size;i++)
{
array_cnt[i] = 0;
array_val[i] = -1;
}
for(i = 0;i < numsSize;i++)
{
for(j = 0;j < size;j++)
{
if(nums[i] == array_val[j])
{
array_cnt[j]++;
break;
}
else if(array_cnt[j] == 0 && array_val[j] == -1)
{
array_val[j] = nums[i];
array_cnt[j]++;
break;
}
}
PrintfArray(array_val,size);
PrintfArray(array_cnt,size);
printf("======================\n");
}
for(i = 0;i < size;i++)
{
if(array_cnt[i] == 1)
{
res = array_val[i];
free(array_val);
free(array_cnt);
return res;
}
}
}
int singleNumber_v1(int* nums, int numsSize)
{
int i;
int res = nums[0];
for(i = 1;i < numsSize;i++)
{
res = res ^ nums[i];
}
return res;
}
四、虚机运行截图
五、leecode提交代码
(1)方法1
int singleNumber(int* nums, int numsSize){
int size = (numsSize - 1) / 2 + 1;
int *array_val = malloc(sizeof(int) * size);
int *array_cnt = malloc(sizeof(int) * size);
int i,j;
int res;
for(i = 0;i < size;i++)
{
array_cnt[i] = 0;
array_val[i] = -1;
}
for(i = 0;i < numsSize;i++)
{
for(j = 0;j < size;j++)
{
if(nums[i] == array_val[j])
{
array_cnt[j]++;
break;
}
else if(array_cnt[j] == 0 && array_val[j] == -1)
{
array_val[j] = nums[i];
array_cnt[j]++;
break;
}
}
}
for(i = 0;i < size;i++)
{
if(array_cnt[i] == 1)
{
res = array_val[i];
free(array_val);
free(array_cnt);
return res;
}
}
return 0;
}
(2)方法2
int singleNumber(int* nums, int numsSize){
int i;
int res = nums[0];
for(i = 1;i < numsSize;i++)
{
res = res ^ nums[i];
}
return res;
}
六、leecode运行截图