【算法】【线性表】【数组】只出现一次的数字 III
1 题目
给你一个整数数组 nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。
有关位运算的知识:https://leetcode.cn/circle/discuss/CaOJ45/
示例 1:
输入:nums = [1,2,1,3,2,5] 输出:[3,5] 解释:[5, 3] 也是有效的答案。
示例 2:
输入:nums = [-1,0] 输出:[-1,0]
示例 3:
输入:nums = [0,1] 输出:[1,0]
提示:
2 <= nums.length <= 3 * 104
-231 <= nums[i] <= 231 - 1
- 除两个只出现一次的整数外,
nums
中的其他数字都出现两次
2 解答
class Solution { public int[] singleNumber(int[] nums) { // 这个就跟我们上节看到的异或的特性有关了 int one = 0; for (int num : nums) { one ^= num; } // 假如那两个数是 a,b 那么现在 one = a ^ b // 并且 one 肯定不为0,因为 a不等于b // 那么怎么把 a,b拆到不同的数组里边,并且其他出现两次的都能划分到一个数组里 // 那么 a,b哪里不同呢?就是one的结果 每一个位上等于1的就能区分a,b // 从 one 随机取一个位不等于0的,取低位的巧妙方法 int flag = one & -one; int[] res = new int[2]; for (int num : nums) { if ((num & flag) == 0) { res[0] ^= num; } else { res[1] ^= num; } } return res; } }
加油。
分类:
算法 / 数组
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了