题目说明
- 给定一个非空整数数组;
- 除了某个元素只出现一次以外,其余每个元素均出现两次;
- 找出那个只出现了一次的元素。
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
解法
【基于Java】
方法一:双循环+布尔数组比较【自写,通过】
public int singleNumber(int[] nums) {
int length = nums.length;
int targetValue = nums[0];
boolean[] read = new boolean[length];
for (int i = 0; i < length; i++) {
if (!read[i]){
for (int j = i+1; j < length; j++) {
if (nums[i] == nums[j]){
read[i] = true;
read[j] = true;
}
}
}
}
for (int i = 0; i < length; i++) {
if (!read[i]){
targetValue = nums[i];
}
}
return targetValue;
}
方法二:使用Set,重复元素只会出现两次,偶数重复元素就会插入失败;但不适用于重复奇数次的情况【借鉴,通过】
public int singleNumber(int[] nums) {
Set<Integer> integerSet = new HashSet<>();
for (int num : nums){
if (!integerSet.add(num)){
integerSet.remove(num);
}
}
return (int) integerSet.toArray()[0];
}
方法三:使用HashMap统计出现次数【自写,通过】
public int singleNumber(int[] nums) {
Map<Integer, Integer> countMap = new HashMap<>();
for (int num : nums){
if (countMap.containsKey(num)){
countMap.put(num, countMap.get(num)+1);
} else {
countMap.put(num, 1);
}
}
for (Integer num : countMap.keySet()){
if (countMap.get(num) == 1){
return num;
}
}
return 0;
}
方法四:位运算, 适用于重复元素出现偶数次的情况【借鉴,通过】
位运算: n ^ n = 0 n ^ 0 = n
public int singleNumber(int[] nums) {
int temp = nums[0];
for (int i = 1; i < nums.length; i++) {
temp = temp ^ nums[i];
}
return temp;
}