只出现一次的数字
最后更新:2023-12-02
链接:https://leetcode.cn/leetbook/read/top-interview-questions-easy/x21ib6/
题目描述
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
 
提示:
- \(1 <= nums.length <= 3 * 10^4\)
 
- \(-3 * 10^4 <= nums[i] <= 3 * 10^4\)
 
- 除了某个元素只出现一次以外,其余每个元素均出现两次。
 
 
思路
先排序,然后把数组分成两块,偶数位的一起,奇数位的一起,分别计算和。
因为题目中只有一个元素只出现一次,其他的元素都是出现两次。
那么先排输入个数是偶数的,这样只处理输入个数是奇数的。
分别计算和之后,奇数位肯定是比偶数位是要多计算一个数的,这样用奇数位的和-偶数位的和,就是我们需要的结果,防止有负数,千万不要取绝对值。
 
| C | 
|---|
 | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
int* compForSingleNumber(const void *a, const void *b) {
    return *(int *)b - *(int *)a;
}
int singleNumber(int* nums, int numsSize){
    if (numsSize %2 == 0) {
        return 0;
    }
    int numa = 0;
    int numb = 0;
    qsort(nums,numsSize,sizeof(int),compForSingleNumber);
    for (int i = 0; i < numsSize - 1; i++) {
        numa += nums[i++];
        numb += nums[i];
    }
    numa += nums[numsSize - 1];
    return numa - numb;
}
  | 
 
 
| C | 
|---|
 | #include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 两个相同的数字,亦或之后结果为0
// 0与任何数组亦或的结果,为对应数字
int singleNumber(int* nums, int numsSize){
    int result = 0;
    for (int i = 0; i < numsSize; i++) {
        result = result ^ nums[i];
    }
    return result;
}
  | 
 
 
| Go | 
|---|
 | func singleNumber(nums []int) int {
    stack := map[int]int{}
    for _, v := range nums {
        stack[v]++
    }
    for key, val := range stack {
        if val != 2 {
            return key
        }
    }
    return 0
}
  | 
 
 
| Go | 
|---|
 | import sort
func singleNumber(nums []int) int {
    n := len(nums)
    if n%2 == 0 {
        return 0
    }
    sort.Ints(nums)
    for index := 0; index < n; index++ {
        // 奇数,并且前面都匹配上了
        if index+1 >= n && n%2 != 0 {
            return nums[index]
        }
        if nums[index] != nums[index+1] {
            return nums[index]
        }
        index++
    }
    return 0
}
  | 
 
 
| Go | 
|---|
 | import sort
func singleNumber(nums []int) int {
    n := len(nums)
    if n%2 == 0 {
        return 0
    }
    sort.Ints(nums)
    sumA, sumB := 0, 0
    for index := 0; index < n-1; index++ {
        sumA += nums[index]
        sumB += nums[index+1]
        index++
    }
    sumA += nums[n-1]
    return sumA - sumB
}
  | 
 
 
| Go | 
|---|
 | // 两个相同的数字,亦或之后结果为0
// 0与任何数组亦或的结果,为对应数字
func singleNumber(nums []int) int {
    result := 0
    for _, v := range nums {
        result = result ^ v
    }
    return result
}
  |