只出现一次的数字
最后更新: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
}
|