1. 数组中只有一个独特的数字,其他的都是出现两次
这种情况就遍历数组,然后一直做异或运算就好,得到的答案就是那个独特的数字
2. 数组中有两个独特的数字,其他的是出现两次
将数组数字分组,使得这两个独特的数字不在一组,而相同的数字都恰好在一组。
思路:遍历数组,异或运算;将得到的异或运算值与1做&运算,然后判断数组中该位为0的为一组,该位为1的为一组。
分别对分好的两组进行异或运算,得到的值就是返回的结果
class Solution {
public int[] singleNumbers(int[] nums) {
int res=0;
int[] temp=new int[]{0,0};
for(int num:nums)
{
res^=num;
}
int s=1;
while((res&s)==0)
{
s<<=1;
}
for(int num:nums){
if((s&num)==0) temp[0]^=num;
if((s&num)!=0) temp[1]^=num;
}
return temp;
}
}
3. 数组中有一个独特的数字,但是其他都是出现三次
家人们,这个真的很难。用有限状态自动机
class Solution {
public int singleNumber(int[] nums) {
int ones = 0, twos = 0;
for(int num : nums){
ones = ones ^ num & ~twos;
twos = twos ^ num & ~ones;
}
return ones;
}
}
我只想到了哈希表,xsl
class Solution {
public int singleNumber(int[] nums) {
Map<Integer,Integer> temp=new HashMap<Integer,Integer>();
for(int i=0;i<nums.length;i++)
{
if(!temp.containsKey(nums[i])) temp.put(nums[i],i);
else{
temp.replace(nums[i],-1);
}
}
for(Map.Entry<Integer,Integer> entry:temp.entrySet()){
int po=entry.getValue();
if(po!=-1) return entry.getKey();
}
return -1;
}
}