当前位置: 首页 > news >正文

算法题(24):只出现一次的数字(二)

审题:

数组中除了答案元素只出现一次外,其他元素都会出现三次,我们需要找到并返回答案元素

思路:

由于现在会出现三次,所以利用异或运算符的方法就会失效。而所有数据都在32位二进制范围内,所以我们采用依次确定二进制位的方法来计算

方法:依次确定二进制位

对于只出现一次的数据,它的第i位二进制数可能是0或1.

对于出现三次的数据,它的第i位二进制数据可能是0/1,但是若将他们加起来就一定是3的倍数(0或3)

而如果我们对数组中所有元素第i位二进制数的和除以3并取余数就可得到答案第i位的二进制数,然后将这位给到答案上即可

解题:

外层循环:目的是进行不同位数答案的计算与赋值

内层循环:将nums数组所有元素的第i位(i从0开始)加起来给到total

if语句:当余数是1说明我们答案在当前位数的二进制数是1,需要把1给到答案的第i位

若余数不是1,说明我们答案在当前位数的二进制数是0,由于我们答案初始化为0(相当于32为二进制数都是0),所以0就不用我们去赋值了

关键代码:

1.如何得出第i位二进制数的值?

首先把数据右移i位,然后利用位与运算和1进行运算

因为1的前面31位都是0,所以不管e前面31位是多少,最后都会变成0。也就是需要比较的只有第32位,我们把第i位都移动到32位,如果该位大小为1,那么和1进行位与操作就可以得出结果为1,否则为0.这样就实能将对应位大小提取出来

2.如何将答案的第i位赋值为1?

首先把1左移i位,然后与答案进行位或运算

因为1左移i位后,其他位数都为0,位或操作的性质决定了我们不会改变答案的其他位的值。

此时因为答案第i位是0,而我们左移后的“1”的第i位是1了,根据位或性质,第i位运算出来就是1,又因为其他位不变,所以成功在答案其他位不变的情况下实现了赋值1

补充:

位与运算符:&

当两个二进制数对应位的值都是1,那么运算得出1,否则为0

eg:0011 & 1100 -》0000

位或运算符:|

当两个二进制数对应位的值有一个是1,那么就得出1,否则为0

eg:0011 & 1100 ——》1111

137. 只出现一次的数字 II - 力扣(LeetCode)

http://www.lryc.cn/news/514697.html

相关文章:

  • 趣味编程:心形曲线
  • C# 设计模式(结构型模式):享元模式
  • 计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask
  • mysql 死锁案例及简略分析
  • 第四届计算机、人工智能与控制工程
  • RIP配置实验
  • C# 整型、浮点型 数值范围原理分析
  • Adobe Acrobat Pro DC 2023 下载安装教程,附详细图文
  • stable diffusion秋叶启动器安装roop插件
  • 7-14 统计工龄
  • OLED的显示
  • 本地测试文件解析
  • Elasticsearch JavaRestClient版
  • ubuntu 使用s3fs配置自动挂载对象存储
  • SQL字符串截取函数——Left()、Right()、Substring()用法详解
  • 关系分类(RC)模型和关系抽取(RE)模型的区别
  • 什么是索引
  • OJ随机链表的复制题目分析
  • UE5材质节点Distance
  • OSPF - SPF算法简述
  • 7.UE5横板2D游戏,添加分类,创建攻击,死亡逻辑,黑板实现追击玩家行为
  • PostgreSQL对称between比较运算
  • Spring AOP面向切面编程
  • Visual Studio 中增加的AI功能
  • 15. 接雨水
  • 从索尼爱立信手机打印短信的简单方法
  • Java-list均分分割到多个子列表
  • kettle合并表数据
  • 蓝耘平台使用InstantMesh‌生成高质量的三维网格模型!3D内容创作!小白入门必看!!!
  • 关于IDE的相关知识之二【插件推荐】