1,问题简述
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。
请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
2,示例
输入:nums = [4,1,4,6]
输出:[1,6] 或 [6,1]
3,题解思路
集合和数组,键值对集合的使用,三种解法;
4,题解程序
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class SingleNumbersTest {
public static void main(String[] args) {
int[] nums = {4, 1, 4, 6};
int[] singleNumbers = singleNumbers(nums);
for (int num : singleNumbers
) {
System.out.print(num + "\t");
}
}
public static int[] singleNumbers(int[] nums) {
if (nums == null || nums.length == 0) {
return new int[0];
}
int[] array = new int[10001];
for (Integer num : nums
) {
array[num]++;
}
int[] results = new int[2];
int length = array.length;
int j = 0;
for (int i = 0; i < length; i++) {
if (array[i] == 1) {
results[j] = i;
j++;
}
}
return results;
}
public static int[] singleNumbers2(int[] nums) {
if (nums == null || nums.length == 0) {
return new int[0];
}
HashMap<Integer, Integer> hashMap = new HashMap<>(nums.length);
for (int num : nums) {
hashMap.put(num, hashMap.getOrDefault(num, 0) + 1);
}
List<Integer> list = hashMap.entrySet().stream().filter(x -> x.getValue() == 1)
.collect(Collectors.toList()).stream().map(Map.Entry::getKey).collect(Collectors.toList());
int[] results = new int[2];
for (int i = 0, size = list.size(); i < size; i++) {
results[i] = list.get(i);
}
return results;
}
public static int[] singleNumbers3(int[] nums) {
if (nums == null || nums.length == 0) {
return new int[0];
}
HashSet<Integer> hashSet = new HashSet<>();
for (int num : nums) {
if (hashSet.contains(num)) {
hashSet.remove(num);
} else {
hashSet.add(num);
}
}
return hashSet.stream().mapToInt(Integer::intValue).toArray();
}
}
5,题解程序图片版
6,总结
数组的使用