16, 136. 只出现一次的数字
https://leetcode-cn.com/problems/single-number/
思路1: 暴力解法
- 通过arrayList记录数据,如果包含数据,就删除掉,如果没有,就记录到里面
- 最后留在arrayList里面的数据就是只出现过一次的数字
- 代码略
思路2: 通过hashmap或者hashset取代arrayList记录数据
- contains的时间复杂度O(1)
思路3: 位运算
- 位运算中,相同的两个数组位运算为0
- 任何数字和0进行位运算结果都不变
- 而且位运算满足交换律, 所以最后位运算出来的结果就是只出现一次的数字
package com.shangguigu.dachang.algrithm.A06_hashTable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
/**
* @author : 不二
* @date : 2022/4/13-下午9:14
* @desc : 136. 只出现一次的数字
* https://leetcode-cn.com/problems/single-number/
**/
public class A55_singleNumber {
public static void main(String[] args) {
// int[] arr = {2, 2, 1};
int[] arr = {4, 1, 2, 1, 2};
// int i = singleNumber(arr);
int i = singleNumber_v2(arr);
System.out.println("结果是:" + i);
// 使用arrayList的包含,其实也是遍历全部数据
// 不过hashmap就不一样了,可以通过hash直接获取到对应数据
/* ArrayList arrayList = new ArrayList();
arrayList.contains()*/
}
/**
* 思路2:位运算
* 位运算中,相同的两个数组位运算为0
* 任何数字和0进行位运算结果都不变
* 而且位运算满足交换律, 所以最后位运算出来的结果就是只出现一次的数字
*
*/
public static int singleNumber_v2(int[] nums) {
int result = 0;
for (int i = 0; i < nums.length; i++) {
result ^= nums[i];
}
return result;
}
/**
* 思路1:通过hashmap或者hashset来判别个数
*/
public static int singleNumber(int[] nums) {
/*HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(nums[i])) {
// 如果i已经存在,则可以移除来
map.remove(nums[i]);
} else {
map.put(nums[i], 1);
}
}
System.out.println("------");
return map.keySet().iterator().next();*/
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
if (set.contains(nums[i])) {
// 如果i已经存在,则可以移除来
set.remove(nums[i]);
} else {
set.add(nums[i]);
}
}
System.out.println("------");
return set.iterator().next();
}
}