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

面试算法4:只出现一次的数字

题目

输入一个整数数组,数组中只有一个数字出现了一次,而其他数字都出现了3次。请找出那个只出现一次的数字。例如,如果输入的数组为[0,1,0,1,0,1,100],则只出现一次的数字是100。

分析

这个题目有一个简化版的类似的题目“输入数组中除一个数字只出现一次之外其他数字都出现两次,请找出只出现一次的数字”。任何一个数字异或它自己的结果都是0。如果将数组中所有数字进行异或运算,那么最终的结果就是那个只出现一次的数字。
在这个题目中只有一个数字出现了一次,其他数字出现了3次。相同的3个数字异或的结果是数字本身,但是将数组中所有数字进行异或运算并不能消除出现3次的数字。因此,需要想其他办法。
一个整数是由32个0或1组成的。我们可以将数组中所有数字的同一位置的数位相加。如果将出现3次的数字单独拿出来,那么这些出现了3次的数字的任意第i个数位之和都能被3整除。因此,如果数组中所有数字的第i个数位相加之和能被3整除,那么只出现一次的数字的第i个数位一定是0;如果数组中所有数字的第i个数位相加之和被3除余1,那么只出现一次的数字的第i个数位一定是1。这样只出现一次的任意第i个数位可以由数组中所有数字的第i个数位之和推算出来。当我们知道一个整数任意一位是0还是1之后,就可以知道它的数值。

public class Test {public static void main(String[] args) {int[] nums = {0, 1, 0, 1, 0, 1, 100};int result = singleNumber(nums);System.out.println(result);}public static int singleNumber(int[] nums) {int[] bitSums = new int[32];for (int num : nums) {for (int i = 0; i < 32; i++) {bitSums[i] += (num >> (31 - i)) & 1;}}int result = 0;for (int i = 0; i < 32; i++) {result = (result << 1) + bitSums[i] % 3;}return result;}
}
http://www.lryc.cn/news/169415.html

相关文章:

  • #与##的用法
  • Flutter的路由router-页面跳转
  • 24v转5v稳压芯片-5A大电流输出ic
  • Layui + Flask | 表单元素(组件篇)(06)
  • Kakfa - Producer机制原理与调优
  • 基于图像形态学处理和边缘提取算法的路面裂痕检测matlab仿真
  • opencv 基础(持续更新中)
  • 科普现场!万博智云参加第五届张江汇智科普节
  • 【记录】实现从Linux下载下载文件(文件导出功能)并记录过程产生的BUG问题。
  • 可扩展性表设计方案
  • Scotch: Combining SGX and SMM to Monitor Cloud Resource Usage【TEE的应用】
  • 腾讯mini项目-【指标监控服务重构】2023-08-19
  • go实现grpc-快速开始
  • linux上的init 0-6指令作用以及一些快捷键和系统指令
  • Mixin 混入
  • pycharm快捷键
  • 【面试刷题】——Linux基础命令
  • 第四步 Vue2 配置ESLint
  • [.NET学习笔记] - Thread.Sleep与Task.Delay在生产中应用的性能测试
  • 【单线图的系统级微电网仿真】基于 PQ 的可再生能源和柴油发电机组微电网仿真(Simulink)
  • 人脸识别技术应用安全管理规定(试行)|企业采用人脸打卡方式,这4条规定值得关注
  • leetcode 817. 链表组件(java)
  • 分布式事务基础理论
  • 《打造高可用PostgreSQL:策略与工具》
  • 【八大经典排序算法】快速排序
  • vue 父组件给子组件传递一个函数,子组件调用父组件中的方法
  • docker 获取Nvidia 镜像 | cuda |cudnn
  • uTool快捷指令
  • R reason ‘拒绝访问‘的解决方案
  • 许战海战略文库|品类缩量时代:制造型企业如何跨品类打造份额产品?