题目分析
原题:
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [3,3,2]
输出: 2
示例 2:
输入: [5,3,1,3,1]
输出: 5
解题思路
- 数据结构与算法:
数组、位运算、Set特性
- 实现思路1:利用^异或位运算特性 a ^ 0 = a; a ^ a = 0; a ^ b ^ a = a ^ a ^ b;
- 实现思路2:利用Set元素不能重复的特性;
代码实现
具体代码:
/**
* 只出现一次的数字(位运算、Set集合)
**/
public class SingleNumber {
public static void main(String[] args) {
int[] nums = {
3,3,2};
//int[] nums = {5,3,1,3,1};
System.out.println(singleNumer(nums));
}
public static int singleNumer(int[] nums){
//思路1:位运算
int result = 0;
for (int i=0;i<nums.length;i++){
result ^= nums[i];
}
return result;
//思路2:Set特性
// Set<Integer> set = new HashSet<>();
// for (int i = 0; i < nums.length; i++) {
// if(!set.add(nums[i])){
// set.remove(nums[i]);
// }
// }
// return (int)set.toArray()[0];
}
}