28.Single Number

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();
        
    }

方法三:针对方法二,可将map改为list存储元素。但是提交之后leetcode返回运行超时。

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;
        
    }

你可能感兴趣的:(28.Single Number)