137. 只出现一次的数字 II

简介: 137. 只出现一次的数字 II

题目


image.png



思考


暴力破解


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


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

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


image.png

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



非暴力破解


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

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

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

image.png



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

image.png

从图中可以判断得出,我们 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 ,然后做 ^ 运算,然后被摁在地上狠狠的锤,,, 总之,方法很重要吧,




相关文章
|
7月前
|
算法 前端开发
619. 只出现一次的最大数字
619. 只出现一次的最大数字
71 0
|
2月前
|
BI
求数字
【10月更文挑战第3天】求数字。
40 1
|
1月前
倒三角形数字
【10月更文挑战第25天】倒三角形数字。
27 3
|
5月前
|
容器
只出现一次的数字
只出现一次的数字
26 0
|
7月前
|
存储 算法 C++
c++数字
c++数字
32 1
|
6月前
|
人工智能 安全 算法
数字文盲
在数字时代,避免边缘化的关键是正视挑战、持续学习数字技能、关注伦理安全和推广数字素养教育。从基础操作到数据分析,提升数字素养能帮助我们适应变革,同时保护隐私和安全,确保在科技发展中不落伍,共建包容的数字社会。
|
7月前
|
存储 C++ 容器
Acwing.75 和为S的两个数字
Acwing.75 和为S的两个数字
|
7月前
|
算法 C++
只出现一次的数字(C++)
只出现一次的数字(C++)
47 0
|
编解码 人工智能 自然语言处理
SIGGRAPH2023|DreamFace:一句话生成 3D 数字人?
SIGGRAPH2023|DreamFace:一句话生成 3D 数字人?
193 0