136. 只出现一次的数字(数组中除该数字外均出现两次)
问题
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
from Leetcode
解答
C语言
查看当前数字是否出现了2次,是则找下一个。
//1108 ms 6.5 MB
int singleNumber(int* nums, int numsSize){
int i, j;
int ret = 0;
int sum=2;
for(i=0; i < numsSize && sum == 2; i++) {
ret = nums[i];
sum = 0;
for(j=0;j<numsSize; j++) {
if (ret == nums[j]) {
sum++;
}
}
}
return ret;
}
针对数组中的每一个数,进行依次全程检查。
- 如果下标相同,则跳过。
- 如果和下标不同的数相等,则表示出现了两次,验证下一个数。
- 如果检查到最后一个,仍是不相等的,则返回该值。
//868 ms 6.4 MB
int singleNumber(int* nums, int numsSize){
int i, j;
int ret;
for(i = 0; i < numsSize; i++) {
ret = nums[i];
for(j = 0; j < numsSize; j++) {
if(j == i) {
continue;
}
if(ret == nums[j]) {
break;
}
if( j == numsSize -1) {
return ret;
}
}
}
return ret;
}
使用异或算法,任何数 异或 0 = 本身。
同一个数进行异或,结果为0。
//12 ms 6.5 MB
int singleNumber(int* nums, int numsSize){
int ret = 0;
int i;
for (i = 0; i < numsSize; i++) {
ret = ret ^ nums[i];
}
return ret;
}
golang
同异或算法
//16 ms 4.6 MB
func singleNumber(nums []int) int {
ret := 0
for _,v := range nums {
ret = ret ^ v
}
return ret
}

浙公网安备 33010602011771号