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

剑指 Offer 56 - I. 数组中数字出现的次数题解

题目描述:剑指 Offer 56 - I. 数组中数字出现的次数 - 力扣(LeetCode)

一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。

示例 1:

输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]

思路:

异或运算有一个重要的性质:任何数与自身异或的结果为0,任何数与0异或的结果仍然是它本身。

  1. 定义一个等于零的变量,用这个变量异或数组中所有的值;(此时该变量就等于没有重复的两个数异或的结果)
  2. 找到该变量中为1的二进制位;(用来将两个不相等的两个数分隔开。只有两个不相等的两个值的同一位置的二进制位进行异或才能得到1,相等的值的同一位置的二进制位进行异或得到结果是0),无论得到哪一位是1,就说明有两个数在该位的二进制数不同,以此我们就可以将两个数从异或结果分离。
  3. 再次遍历数组,将数组中上述位置的二进制位为1的值放到数组一中,将数组中上述位置的二进制位不为1的值放到数组二中;
  4. 再定义两个等于零的变量,用它分别异或数组一和数组二中所有的值,最终两个变量的异或结果就是两个不相等的值。

代码:

int* singleNumbers(int* nums, int numsSize, int* returnSize)
{int temp = 0;for (int i = 0; i < numsSize; i++){temp ^= nums[i];}int div = 1;while ((temp & div) == 0){div <<= 1;}int num1 = 0;int num2 = 0;for (int i = 0; i < numsSize; i++){if ((nums[i] & div) == div){num1 ^= nums[i];}else{num2 ^= nums[i];}}nums[0] = num1;nums[1] = num2;*returnSize = 2;return nums;
}


本次内容到此结束了!如果你觉得这篇博客对你有帮助的话 ,希望你能够给我点个赞,鼓励一下我。感谢感谢……

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

相关文章:

  • CSDN付费专栏写作协议
  • [保研/考研机试] KY30 进制转换-大整数转二进制 清华大学复试上机题 C++实现
  • vue3多条件搜索功能
  • C++20协程
  • Zabbix 6.0 监控其他
  • Django rest_framework Serializer中的create、Views中的create/perform_create的区别
  • 差异性分析傻瓜版
  • Keystone Automotive EDI 需求分析
  • jmeter创建一个压测项目
  • CEC2013(MATLAB):淘金优化算法GRO求解CEC2013的28个函数
  • AI Deep Reinforcement Learning Autonomous Driving(深度强化学习自动驾驶)
  • Java super
  • 【人工智能前沿弄潮】——生成式AI系列:Diffusers学习(1)了解Pipeline 、模型和scheduler
  • TypeScript 非空断言
  • Python编程——谈谈函数的定义、调用与传入参数
  • 在Ubuntu中使用Docker启动MySQL8的天坑
  • Python3.x String内置函数大全
  • Go异常处理机制panic和recover
  • QMainwindow窗口
  • P5735 【深基7.例1】距离函数
  • prometheus告警发送组件部署
  • CAPL - XML和TestModule结合实现测试项可选
  • Latex安装与环境配置(TeXlive、TeXstudio与VS code的安装)编译器+编辑器与学习应用
  • STM32 F103C8T6学习笔记3:串口配置—串口收发—自定义Printf函数
  • python中字符串内建函数篇4
  • 并发下如何使用redis存储列表数据
  • Leecode螺旋矩阵 II59
  • echarts 横向柱状图
  • Vue3 —— to 全家桶及源码学习
  • (第三篇) ansible-kubeadm在线安装高可以用集群()