给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1] 输出: 1
示例 2:
输入: [4,1,2,1,2] 输出: 4
顺序扫描法:时间复杂度是O(n^2)
哈希表的方法:空间复杂度不是O(1)
应该怎么做才能即满足时间复杂度是O(n)又满足空间复杂度是O(1)的要求呢?
异或的一个性质是:任何一个数字异或它自己都等于0。比如数组{4,5,5},我们先用数组中的第一个元素4(二进制形式:0100)和第二个元素5(0101)进行异或操作得到0001,用得到的元素与第三个元素5(0101)进行异或操作得到0100,正好是结果4。
import java.util.Arrays;
//import java.util.Hashmap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
class Solution {
//异或,超过99%
public static int singleNumber_optmal(int[] nums) {
int result=0;
for(int i=0;i<nums.length;i++)
{
result^=nums[i];
}
return result;
}
//数组排序
public static int singleNumber1(int[] nums) {
Arrays.sort(nums);
int i=0;
while(i<(nums.length-1))
{
if(nums[i]==nums[i+1])
i+=2;
else
return nums[i];
}
return nums[i];
}
//Hash表
public static void singleNumber2(int[] nums) {
Set<Integer> distinct=new HashSet<Integer>();
for(int i=0;i<nums.length;i++)
{
if(distinct.contains(nums[i]))
distinct.remove(nums[i]);
else
distinct.add(nums[i]);
}
Iterator it=distinct.iterator();
while (it.hasNext())
{
System.out.println(it.next());
}
}
public static void main(String[] args)
{
int nums[]= {3,3,2};
singleNumber2(nums);
}
}