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

「优选算法刷题」:只出现一次的数字Ⅲ

一、题目

给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。

你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。

示例 1:

输入:nums = [1,2,1,3,2,5]
输出:[3,5]
解释:[5, 3] 也是有效的答案。

示例 2:

输入:nums = [-1,0]
输出:[-1,0]

示例 3:

输入:nums = [0,1]
输出:[1,0]

二、思路解析

首先,我们可以先做个小优化:当 nums 数组长度为 2 时,说明这两个元素一定只出现了一次,直接返回即可。

然后就要利用到我们熟悉的两条公式:

x ^ x = 0 

x ^ 0 = x 

由于数组中除了两个数字之外,其他数字都出现了两次,因此我们对数组中的所有数字进行异或运算,得到的结果即为两个只出现一次的数字的异或结果。

在第三部分的代码中,我用 n1 和 n2 表示这两个数。

再对数组使用一次 lowbit 运算,目的是根据最低位的不同,把这两个只出现一次的数字分到两个不同的组。

接着我们在遍历一次数组,当有元素和 lowbit 进行或运算后还不等于零,则他就是 n1 了。

另一个只出现一次的数,就让 n1 和 Double 异或一下就出来了,因为 Double 本身就是这两个数的异或。

三、完整代码

class Solution {public int[] singleNumber(int[] nums) {if(nums.length == 2){return nums;}int Double = 0;for(int i = 0 ; i < nums.length ; i ++){Double ^= nums[i];}int n1 = 0;int lowbit = Double & -Double;for(int j = 0 ; j < nums.length ; j ++){if((nums[j] & lowbit) != 0){n1 ^= nums[j];}  }int n2 = Double ^ n1;return new int[]{n1 , n2};}
}

以上就是本篇博客的全部内容啦,如有不足之处,还请各位指出,期待能和各位一起进步!

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

相关文章:

  • Vue-43、Vue中组件自定义事件
  • GitHub 开启 2FA 双重身份验证的方法
  • ASP.NET Core 过滤器 使用依赖项注入
  • 2024年的网创之路应该这样走才对
  • ssh异常报错:Did not receive identification string from
  • MIDI码深度解析
  • 小红书如何做混部?
  • [PHP]严格类型
  • 作为程序员,你必须学会Maven
  • UDF学习(三)数据访问宏
  • Web3技术革新:重新定义在线体验
  • 从前端Vue到后端Spring Boot:接收JSON数据的正确姿势
  • nvm 工具使用介绍
  • Shell 入门_1
  • 力扣hot100 柱状图中最大的矩形 单调栈
  • 018 用户交互Scanner
  • 华为HCIE课堂笔记第十七章 广域网互联技术
  • 代码随想录算法训练营第17天(二叉树5)| 找树左下角的值二叉树的路径总和从中序与后序遍历序列构造二叉树从前序与中序遍历序列构造二叉树
  • 代码随想录 Leetcode106. 从中序与后序遍历序列构造二叉树
  • Log4j Log4j2
  • C语言——如何进行文件操作
  • python中for循环的几个现象
  • openssl3.2 - 测试程序的学习 - 准备openssl测试专用工程的模板
  • Delphi.cz采访​Embarcadero​捷克共和国办事处经理:理查德·库巴特 - 第一部分
  • AI投资或成科技裁员罪魁祸首
  • 解读BEVFormer,新一代自动驾驶视觉工作的基石
  • 【React教程】(1) React简介、React核心概念、React初始化
  • 云计算中的弹性是什么?
  • Vue3基础:pnpm是什么?npm和pnpm的区别?如何使用pnpm?
  • vue中父组件直接调用子组件方法(通过ref)