题目描述:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
方法一(^异或运算符)
异或运算符在两个相等运算符之间运算结果为0,例如4^4=0,4^0=4.
根据异或运算符的提点,所有出现两次的数字最后的运算结构都为0,只有出现一次的数字与0运算结果是本身。
代码如下:
public static int singleNumber(int[] nums) {
int num = 0;
for (int i = 0; i < nums.length; i++) {
num = num ^ nums[i];
}
return num;
}
方法二(借助HashSet)
思路:将元素添加到HashSet,在添加之前判断集合中是否已有该元素,如果有则移除,否则添加。
代码如下:
public static int singleNumber(int[] nums) {
HashSet set = new HashSet<Integer>();
for(int i = 0; i < nums.length; i++){
if(set.contains(nums[i])) {
set.remove(nums[i]);
}else {
set.add(nums[i]);
}
}
int tmp = 0;
Iterator<Integer> it = set.iterator();
while(it.hasNext()) {
System.out.println(tmp=it.next());
}
return tmp;
}
方法三(借助排序)
思路:先将元素排序,这时数组中相等的元素两两相邻,进行判断即可。
public static int singleNumber(int[] nums) {
Arrays.sort(nums);
for(int i = 0; i < nums.length - 1; i+=2) {
if(nums[i] != nums[i+1]) {
return nums[i];
}
}
return nums[nums.length - 1];
}
方法四(暴力法)
思路:按照数组中的顺序遍历元素,进行比较,没有与选定元素相等的元素则返回。
public static int singleNumber(int[] nums) {
if(nums.length > 1) {
for(int i = 0; i < nums.length-1; i++) {
boolean b = false;
for(int j = 0; j < nums.length; j ++) {
if(i == j) continue;
if(nums[i] == nums[j]) {
b = true;
}
}
if(b == false) return nums[i];
}
}
return nums[nums.length-1];
}