1. 问题
假设数组元素为分别为 1-N,一共 N+1 个,其中只有一个元素重复出现,其它元素只出现一个,找出这个重复的元素
2. 思路
2.1 使用 Hash 方法
将出现的元素依次放到一个 hash
表中,每个元素值作为 hash
的 key
,每个元素出现的次数作为 hash
的 value
,初始状态默认 value
为 0,元素每出现一次加 1,当为 2 时表示这个元素出现过两次。
2.2 使用 异或方法
- 每个数字与 0 的异或结果为它本身
- 每个数字与自身的异或结果为 0
- 异或满足交换律和结合律
第一步将数组中所有元素进行异或操作,如 (1^ 2^ 4^ 3^ 5^ 4)
,然后再将异或结果和数字 1-N之间的所有数字进行异或,如 (1^ 2^ 4^ 3^ 5^ 4) ^ (1^ 2^ 3^ 4^ 5) = (1^ 1) ^ (2^ 2) ^ (3^ 3) ^ (4^ 4^ 4) ^ (5^ 5) = 0 ^ 0 ^ 0 ^ 4 ^ 0 = 4
。
3. 代码实现
package main
import "fmt"
func findUniqueOne(a []int) int {
unique := 0
m := make(map[int]int)
for _, v := range a {
m[v] += 1
if m[v] == 2 {
unique = v
break
}
}
return unique
}
func findUniqueTwo(a []int) int {
unique := 0
for _, v := range a {
unique ^= v
}
for i := 1; i < len(a); i++ {
unique ^= i
}
return unique
}
func main() {
arr := []int{1, 2, 4, 3, 5, 4}
fmt.Println(findUniqueOne(arr))
fmt.Println(findUniqueTwo(arr))
}
4. 问题
给定一个由 n-1 个整数组成的未排序的数组序列,其元素都是由 1~n 中的不同的整数,请找出数组序列中缺失的整数。
package main
import "fmt"
func findLossNum(a []int) int {
ret := 0
for i := 0; i < len(a); i++ {
ret ^= a[i]
}
for i := 1; i <= len(a)+1; i++ {
ret ^= i
}
return ret
}
func main() {
arr := []int{1, 2, 3, 4, 5, 7}
lossNum := findLossNum(arr)
fmt.Println("lossNum is ", lossNum)
}