(java)Single Number III
来源:互联网 发布:seo 知乎 编辑:程序博客网 时间:2024/06/06 12:50
Given an array of numbers nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5]
, return [3, 5]
.
Note:
- The order of the result is not important. So in the above example,
[5, 3]
is also correct.
- Your algorithm should run in linear runtime complexity. Could you implement it using only constant space complexity?
思路:本题联系Single Number那题很容易想到将这组数据分成两个部分,每一个部分中各含有一个只出现一次的数,这样利用Single Number中的方法将这两个数找出来就行。本题的焦点就转移到了如何划分这个数组能达到这个要求上了。除了只出现一次的两个数外,其余的数字异或的结果是0.
两个只出现一次的数字A和B,AxorB=C;C的二进制数中为1的那一位在A和B中肯定是不同的。比如3xor5=011xor101=110;只需要根据这一位为0还是为1就可保证将这两个单独出现的数字划分在不同的部分中。
用到一个公式n&(~(n-1))可以得到n的最后一个1的掩码。根据这个掩码就可以将他们分成两部分。
这个掩码就跟网络通信中的子网掩码一个作用。
代码如下(已通过leetcode)
public class Solution {
public int[] singleNumber(int[] nums) {
int[] ans=new int[2];
int temp=0;
for(int i=0;i<nums.length;i++){
temp^=nums[i];
}
int mask=temp&(~(temp-1));
int A=0;
int B=0;
for(int i=0;i<nums.length;i++){
if((mask&nums[i])==0) A^=nums[i];
else B^=nums[i];
}
ans[0]=A;
ans[1]=B;
return ans;
}
}
public int[] singleNumber(int[] nums) {
int[] ans=new int[2];
int temp=0;
for(int i=0;i<nums.length;i++){
temp^=nums[i];
}
int mask=temp&(~(temp-1));
int A=0;
int B=0;
for(int i=0;i<nums.length;i++){
if((mask&nums[i])==0) A^=nums[i];
else B^=nums[i];
}
ans[0]=A;
ans[1]=B;
return ans;
}
}
0 0
- (java)Single Number III
- [letecode java ] Single Number III
- leetcode260 Single Number III java
- LeetCode 260 -Single Number III ( JAVA )
- leetcode-java-260. Single Number III
- leetcode oj java 260. Single Number III
- Single Number III
- Single Number III
- [LeetCode] Single Number III
- [leetcode] Single Number III
- 260 Single Number III
- [Leetcode]Single Number III
- [leetcode] Single Number III
- Leetcode: Single Number III
- 260 Single Number III
- LeetCode || Single Number III
- Single Number III
- Single Number III
- 在GridView控件中CheckBoxFiled如何添加复选框
- android静态注册的广播在某些手机上无法正常接收
- 软件工程导论考试-试卷7
- Linux 学习计划
- 利用ViewPager实现仿微信Tab效果
- (java)Single Number III
- c语言学习
- 常用linux命令
- Linux下USB驱动框架分析
- java内存管理
- Android使用系统自带的audioreorder和mediaplayer进行录音和播放,外加进度条的滚动!
- Linux命令--mtr----traceroute+ping
- Android样式之Shape
- BZOJ_P1497&Codevs_P1789 最大获利(最大权闭合图最小割最大流)