题目
思考
暴力破解
看到该题目,首先想到的便是,将数据,按序存入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 ,然后做 ^ 运算,然后被摁在地上狠狠的锤,,, 总之,方法很重要吧,