给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,3,2]
输出: 3
示例 2:
输入: [0,1,0,1,0,1,99]
输出: 99
链接:https://leetcode-cn.com/problems/single-number-ii
思路:先排序,再比较。
int cmp(const void *a, const void *b) {
if(*(int *)a == *(int *)b)
return 0;
return *(int *)a > *(int *)b ? 1 : -1;
}
int singleNumber(int* nums, int numsSize){
int i;
int c = 0;
qsort(nums,numsSize,sizeof(int),cmp);
for(i = 0; i < numsSize-1; i++) {
if(nums[i] == nums[i+1]) {
c++;
} else {
if(c == 0)
return nums[i];
else
c = 0;
}
}
return nums[i];
}
法2,大佬的做法,让出现三次的值保持为0,让出现一次的值显现。
int singleNumber(int* nums, int numsSize){
int i;
int a = 0, b =0;
for(i = 0; i < numsSize; i++) {
a = (a ^ nums[i]) & ~b;
b = (b ^ nums[i]) & ~a;
}
return a;
}