查找数组中唯一重复的元素和查找数组中丢失的数(哈希法和异或法)

1. 问题

假设数组元素为分别为 1-N,一共 N+1 个,其中只有一个元素重复出现,其它元素只出现一个,找出这个重复的元素

2. 思路

2.1 使用 Hash 方法

将出现的元素依次放到一个 hash 表中,每个元素值作为 hashkey ,每个元素出现的次数作为 hashvalue,初始状态默认 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)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值