260. 只出现一次的数字 III

题目:

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。
找出只出现一次的那两个元素。

示例 :

输入: [1,2,1,3,2,5]
输出: [3,5]
注意:

结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

思路:

总体思路利用了136针对一个元素情况时的解法,针对这道题,需要做的是如何把数组中的元素分到要找的这两个不同元素所在的不同的"族"中。

代码:

 1 class Solution {
 2 public:
 3     vector<int> singleNumber(vector<int>& nums) {
 4         int n = nums.size();
 5         if(n < 2)
 6             return {};
 7         int ab = 0;
 8         for(int i = 0;i < n;i++)
 9             ab^=nums[i];
10         int i = 0;
11         for(;i < sizeof(int)*8;i++)
12         {
13             int mask = 1<<i;
14             if((mask & ab)!=0)
15                 break;
16         }
17         int a = 0;
18         int b = 0;
19         for(int j = 0;j < n;j++)
20         {
21             int mask = 1<<i;
22             if(mask & nums[j])
23                 a^=nums[j];
24             else
25                 b^=nums[j];
26         }
27         return {a,b};
28
29     }
30 };

原文地址:https://www.cnblogs.com/zjuhaohaoxuexi/p/11774241.html

时间: 2024-08-30 16:50:42

260. 只出现一次的数字 III的相关文章

Leetcode 260.只出现一次的数字III

只出现一次的数字III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出: [3,5] 注意: 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案. 你的算法应该具有线性时间复杂度.你能否仅使用常数空间复杂度来实现? 分析 1. 数组中所有数字做异或运算,因为有两个元素只出现一次,所以最后的异或运算结果sum 为两个单独元素x,y的异或结果.因为相同数字异或运算结

力扣第260题 只出现一次的数字 III

力扣第260题 只出现一次的数字 III 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次. 找出只出现一次的那两个元素. 示例 : 输入: [1,2,1,3,2,5] 输出: [3,5] 注意: 结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案. 你的算法应该具有线性时间复杂度.你能否仅使用常数空间复杂度来实现? class Solution { public: vector<int> singleNumber(vector<int&

LeetCode 137 Single Number II(只出现一次的数字 II)(*)

翻译 给定一个整型数组,除了某个元素外其余的均出现了三次.找出这个元素. 备注: 你的算法应该是线性时间复杂度.你可以不用额外的空间来实现它吗? 原文 Given an array of integers, every element appears three times except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you im

LeetCode 136 Single Number(只出现一次的数字)

翻译 给定一个整型数组,除了某个元素外其余元素均出现两次.找出这个只出现一次的元素. 备注: 你的算法应该是一个线性时间复杂度.你可以不用额外空间来实现它吗? 原文 Given an array of integers, every element appears twice except for one. Find that single one. Note: Your algorithm should have a linear runtime complexity. Could you i

面试题40:数组中只出现一次的数字

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 题目分析 剑指Offer(纪念版)P211 ① 自己与自己异或为0 ② 0与数A异或为A ③ 异或满足交换律 代码实现 void FindNumsAppearOnce(int data[], int length, int* num1, int* num2) { if (data == NULL || length < 2) return; in

数组中只出现一次的数字(剑指offer)思维有点巧

数组中只出现一次的数字 参与人数:1144时间限制:1秒空间限制:32768K 通过比例:21.75% 最佳记录:0 ms|0K(来自  牛客563536号) 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目链接:http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?rp=2&ru=/ta/coding-interviews&qru=/ta/coding

数组中只出现一次的数字

题目 一个整型数组里除了两个数字之外,其他数字都出现了两次.请找出这两个只出现一次的数字.要求时间复杂度O(n),空间复杂度O(1) 思路 我们知道如果把题目中的两个数字换成一个的话,整个数组内的元素连续异或,最终的数便是那个出现一次的数,因为异或的性质:相同为0,不同为1,所以有任何数字异或自己都是0. 换成两个数字后,我们可以继续全局异或,得到的数必然不等于0,那么也就是说二进制中必然有一位是1,比如是第K位为1,那么按照所有元素的第K位是否为1划分成两个子区间,这样,我们在这两个子区间内按

【剑指offer】数组中只出现一次的数字

一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. /*考虑过程: 首先我们考虑这个问题的一个简单版本:一个数组里除了一个数字之外,其他的数字都出现了两次.请写程序找出这个只出现一次的数字. 这个题目的突破口在哪里?题目为什么要强调有一个数字出现一次,其他的出现两次?我们想到了异或运算的性质:任何一个数字异或它自己都等于0 .也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些出现两次的数字全部在异或中

数组中只出现一次的数字-剑指Offer

数组中只出现一次的数字 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 思路 先考虑一个数组里只有一个数出现一次,其他两个数都出现两次的情况:一个数跟自己异或后为0,一个数组里只有一个数出现一次其他两次,挨个异或后最后得到的结果就是只出现一次的那个数. 我们把这个数组分为两部分,每部分只有一个数只出现一次:我们分的时候,把所有数都异或后,得到的结果肯定不为0,其实是那两个只出现一次的不同的数的异或,我们从低位到高危找到第一个不为0的那位,异