Given an array of integers, every element appears twice except for one. Find that single one.
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
最佳方法:采用异或操作
public int singleNumber4(int[] nums) { int re = nums[0]; for(int i=1;i<nums.length;i++){//两个相同的数字进行异或操作之后变成0 re = re ^ nums[i]; } return re; }
public int singleNumber(int[] nums) { Arrays.sort(nums); for(int i=0;i<nums.length-1;i=i+2){ if(nums[i]!=nums[i+1]){ return nums[i]; } } return nums[nums.length-1]; }方法二:用hashmap,依次读取数组元素,如果该元素不在map中则放到map中,如果在map中则删除该元素(因为数组中元素出现两次(只有一个元素出现一次)),则最后map中剩下的那个元素就是所求的元素。
public int singleNumber2(int[] nums) { HashMap<Integer,Integer> map = new HashMap(); for(int i=0;i<nums.length;i++){ if(map.containsKey(nums[i])){//因为每个元素最多只包含2个,所以在找到这个元素已经在map中存在,则可删除 map.remove(nums[i]); }else{ map.put(nums[i],1); } } return map.keySet().iterator().next(); }
public int singleNumber(int[] nums) { //提交之后说是运行超时 LinkedList list = new LinkedList(); for(int i=0;i<nums.length;i++){ if(list.contains(nums[i])){//因为每个元素最多只包含2个,所以在找到这个元素已经在map中存在,则可删除 list.remove(list.indexOf(nums[i])); }else{ list.add(nums[i]); } } return (int) list.get(0); }
这个题的标准做法是利用异或运算的这两个法则: 1. a ^ b = b ^ a
2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c; 举个例子:
1^2^3^4^4^3^2的结果是啥呢? 一眼大概开不出来
根据上面两个法则,改变一下顺序吧 改成2^2^3^3^4^4^1 现在,结果一目了然了吧~ 显然是1呗。
public int singleNumber4(int[] nums) { int re = nums[0]; for(int i=1;i<nums.length;i++){//两个相同的数字进行异或操作之后变成0 re = re ^ nums[i]; } return re; }