137. 只出现一次的数字 II

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

题目

思考

暴力破解

看到该题目,首先想到的便是,将数据,按序存入map, 然后遍历map,其结果值 为1 的,作为返回数据集之一即可

假设我们有数组: [3,5,3,2,5,3,5] , 求出不一致的数

我们将数据存入 map,其值为出现的个数 ,可以得到

再通过遍历 value ,判断其值 等于1的就是我们需要的值了。

非暴力破解

除了map,我思前想后,都没想到如何解决该问题,于是打开了题解,利用二进制位解决问题,豁然开朗,特记录一下

假设我们有数组: [3,5,3,2,5,3,5] , 求出不一致的数

我们先将该数,转化为 二进制,数据 应当如下

现在将数据每位加来 对 3 进行取余,得到的数据,就是我们需要的数据了,

从图中可以判断得出,我们 0000 0010 转化为 10进制就是2,也就是我们需要的不一致的数

代码提交

暴力破解

题目中 除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 ,可以设置如果map中的val出现的次数为3 ,则删除该数据,因为该数据不是我们需要的值

代码

func singleNumber(nums []int) int {
	maps := make(map[int]int,0)

	for i:=0;i<len(nums);i++ {
		maps[nums[i]] = maps[nums[i]]+1
		if 3 == maps[nums[i]] {
			delete(maps,nums[i])
		}
	}

	for k,v := range maps {
		if v == 1 {
			return k
		}
	}
	return 0
}

非暴力破解

将二进制数,“按列”加起来对3进行取余,若是0则不管它,若是1,则这个位数正是我们需要的数,将它转换为10进制,最后将此结果返回回去即可

func singleNumber(nums []int) int {

	var result int32 = 0
	var bitSum int32 = 0

	for i := 0 ; i < 32 ; i++ {

		bitSum = 0
		for _ , v := range nums {
			bitSum =  bitSum + int32(v) >> i & 1
		}

		if 1 == bitSum % 3 {
			result = result + 1 << i
		}
	}

	return int(result)
}

遇到的问题和解决

在写过136题目后,想非暴力破解方法时,总想的是直接利用数字做运算,利用 2 2 2 , 总想着能不能再加一个 2 ,然后做 ^ 运算,然后被摁在地上狠狠的锤,,, 总之,方法很重要吧,

posted @ 2022-03-29 19:01  pdudos  阅读(0)  评论(0)    收藏  举报  来源