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
}
posted @ 2020-09-30 11:04  Dar1inge  阅读(103)  评论(0)    收藏  举报