LeeCode 137. 只出现一次的数字II
给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法且使用常数级空间来解决此问题。
示例 1:
输入:nums = [2,2,3,2] 输出:3
示例 2:
输入:nums = [0,1,0,1,0,1,99] 输出:99
提示:
1 <= nums.length <= 3 * 104-231 <= nums[i] <= 231 - 1nums中,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次
答案:
// 整型数组比较函数(升序)
int compare(const void* a, const void* b) {return (*(int*)a - *(int*)b);
}int singleNumber(int* nums, int numsSize) { // LeeCode 137. 只出现一次的数字II// 先排序qsort(nums, numsSize, sizeof(int), compare);int n = nums[0];int count = 1;for (int i = 1; i < numsSize; i++) {if (nums[i] == n) {count++;}else {if (count == 1) {return n;}if (i == numsSize - 1) {return nums[i];}n = nums[i];count = 1;}}return n;
}测试代码:
void testLeeCode137(void) {int nums[] = {2, 2, 3, 2};int res = singleNumber(nums, 4);printf("res: %d\n", res);
}打印:

ok. 提交到LeeCode报错:

应该是compare函数的减法运算结果超int范围了。该函数修改后如下:
int compare(const void* a, const void* b) {//return (*(int*)a - *(int*)b); // 运算可能会超int范围if (*(int*)a > *(int*)b) return 1;if (*(int*)a == *(int*)b) return 0;return -1;
}再次提交到LeeCode:

ok.
