一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
数据范围:数组长度 ,数组中每个数的大小
要求:空间复杂度 ,时间复杂度
要求:空间复杂度 ,时间复杂度
提示:输出时按非降序排列。
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型一维数组 */ public int[] FindNumsAppearOnce (int[] nums) { // write code here // 核心思想:采用异或运算的方法,先求出这两个数字的异或值,再根据最低为1的位分别求出两个数值 // 算法时间复杂度O(N),额外空间复杂度O(1) // 1.先异或一轮,得到一个异或值,表示两个只出现了一次的数字的异或结果 int n = nums.length; int xor = 0; for (int i = 0; i < n; i++) { xor ^= nums[i]; } // 2.在此基础上,通过位运算得到一个01组成的二进制数,这个数只有一个1,其余位置均为0,且1的那个位置是异或结果的1的最低位 xor = xor & (~xor + 1); // 此时,xor只有一位是1,意义是:两个只出现一次数字在这个位置上数字不同 // 3.再遍历一轮nums数组,此时根据与xor的与结果分成两组,每一组分别异或出一个值,即为待求值 int xor1 = 0; int xor2 = 0; for (int i = 0; i < n; i++) { if ((nums[i] & xor) == 0) { xor1 ^= nums[i]; } else { xor2 ^= nums[i]; } } // 4.按照题意输出结果 int[] result = new int[2]; result[0] = Math.min(xor1, xor2); result[1] = Math.max(xor1, xor2); return result; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型一维数组 */ public int[] FindNumsAppearOnce (int[] nums) { // write code here HashSet<Integer> set = new HashSet<>(); for (int num : nums) { if (set.contains(num)) { set.remove(num); } else { set.add(num); } } return set.stream().sorted().mapToInt(Integer::intValue).toArray(); } }
public int[] FindNumsAppearOnce (int[] nums) { // write code here int[] res = new int[2]; if (nums == null || nums.length == 0) return res; Map<Integer, Integer> map = new HashMap<>(); for(int i=0;i<nums.length;i++) { int key = nums[i]; if(map.containsKey(key)) { map.put(key, map.get(key)+1); } else { map.put(key, 1); } } Set<Map.Entry<Integer, Integer>> et = map.entrySet(); int idx = 0; for(Map.Entry<Integer, Integer> item : et) { if(item.getValue().equals(1)) { res[idx++] = item.getKey(); } if (idx >= 2) break; } return res; }
public int[] FindNumsAppearOnce (int[] nums) { // write code here int[] res=new int[2]; int index=0; HashMap<Integer ,Integer> map = new HashMap<>(); for(int num:nums){ map.put(num ,map.getOrDefault(num ,0)+1); } Iterator<Map.Entry<Integer ,Integer>> iter=map.entrySet().iterator(); while(iter.hasNext()){ Map.Entry<Integer ,Integer> entry=iter.next(); if(entry.getValue()==1){ res[index++]=entry.getKey(); } } return res; }
public int[] FindNumsAppearOnce (int[] nums) { // write code here int[] ret = new int[2]; if (nums.length == 0) { return null; } HashMap<Integer, Integer> map = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (map.containsKey(nums[i])) { map.remove(nums[i]); continue; } map.put(nums[i], 1); } int i = 0; for (Map.Entry<Integer, Integer> entry : map.entrySet()) { ret[i++] = entry.getKey(); } return ret; }
Map<Integer, Integer> maps = new HashMap<>(); for (int i = 0; i < nums.length; i++) { if (maps.containsKey(nums[i])) { Integer a = maps.get(nums[i]); maps.put(nums[i], ++a); } else { maps.put(nums[i], 1); } } List<Integer> a = new ArrayList(); maps.forEach((k, v)-> {if (k == 1) { a.add(v); } }); int b[]= Arrays.stream(a.stream().toArray(Integer[] ::new)).mapToInt(Integer::valueOf).toArray(); Arrays.sort(b); return b;
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型一维数组 * @return int整型一维数组 */ public int[] FindNumsAppearOnce (int[] nums) { // 1. 参数校验 if(nums == null || nums.length == 0) { return null; } // 2. 创建哈希表存储元素以及对应的出现次数 HashMap<Integer,Integer> map = new HashMap<>(); // 3. 遍历数组元素,存储元素以及出现次数 for(int i = 0;i < nums.length;i++) { // 4. 如果哈希表中不存在此元素,那就添加此元素 if(!map.containsKey(nums[i])) { map.put(nums[i],1); } else { // 5. 如果哈希表中存在此元素,那就让他的 value + 1 map.put(nums[i],map.get(nums[i]) + 1); } } // 6. 创建答案数组,保存数组中只出现一次的两个数字 int[] ans = new int[2]; int count = 0; // 7. 再次遍历数组,找到频率为 1 的两个数 for(int i = 0;i < nums.length;i++) { if(map.get(nums[i]) == 1) { ans[count++] = nums[i]; } } // 8. 题目要求升序 if(ans[0] > ans[1]) { int tmp = ans[0]; ans[0] = ans[1]; ans[1] = tmp; } return ans; } }
public int[] FindNumsAppearOnce (int[] array) { // write code here Map<Integer, Integer> map = new LinkedHashMap<>(); for (int arr : array) { if (map.containsKey(arr)) { map.remove(arr); } else { map.put(arr, arr); } } int[] ints = map.entrySet().stream().mapToInt(e -> e.getKey()).sorted().toArray(); return ints; }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int整型一维数组 */ public int[] FindNumsAppearOnce (int[] array) { int ans=0; for(int i=0;i<array.length;i++){ ans=ans^array[i]; } int h=1; while((h&ans)==0){ h<<=1; } int group1=0; int group2=0; for(int i=0;i<array.length;i++){ if((h&array[i])==0){ group1=group1^array[i]; }else{ group2=group2^array[i]; } } return new int[]{Math.min(group1,group2),Math.max(group1,group2)}; } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int整型一维数组 */ public int[] FindNumsAppearOnce (int[] array) { // write code here if(array == null || array.length <= 0) { return null; } Set<Integer> set = new TreeSet<>(); for(int a : array) { if (set.contains(a)) { set.remove(a); }else { set.add(a); } } //最后剩下的元素就是只出现一次的数字 int[] result = new int[2]; Iterator<Integer> it = set.iterator(); int index = 0; while(it.hasNext()) { result[index++] = it.next(); } return result; } }
public class Solution { public int[] FindNumsAppearOnce (int[] array) { Map<Integer, Integer> map = new HashMap(); List<Integer> list = new ArrayList<>(); for (int i = 0; i < array.length; i++) { if (map.containsKey(array[i])) { map.put(array[i], map.get(array[i]) + 1); } else { map.put(array[i], 1); } } Set<Map.Entry<Integer, Integer>> entries = map.entrySet(); for (Map.Entry<Integer, Integer> entry : entries) { if (entry.getValue() == 1) { list.add(entry.getKey()); } } Collections.sort(list); return list.stream().mapToInt(Integer::intValue).toArray(); } }
public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int整型一维数组 */ public int[] FindNumsAppearOnce (int[] array) { // 排序 heapSort(array); // 返回值 int[] res = new int[2]; // 返回值数组res 的索引,用于添加数据 int resIndex = 0, y = 0; // 保存每次array的元素 异或结果 // 遍历数组 for (int i = 0; i < array.length - 1; i++) { // 首次y的结果是 array[i],如果后面的循环遇到相同的,将回到0的位置 y ^= array[i]; // 如果当前元素 和 下一位元素不同,并且y不为0时,表示当前元素没有重复 if(array[i+1] != y && y != 0){ res[resIndex] = y; // 加入数组 resIndex++; // 索引后移 y = 0; // y置为0,下次继续异或 } } // 最后判断如果1位置等于0,表示最后一个不重复的数字在 数组末尾,将末尾数赋值给res的1位置 if(res[1] == 0) res[1] = array[array.length - 1]; // 最终返回 return res; } public void heapSort(int[] arr){ for (int i = arr.length / 2 - 1; i >= 0; i--) buildBigHeap(arr, i, arr.length); int temp; for (int i = arr.length - 1; i > 0; i--) { temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; buildBigHeap(arr, 0, i); } } public void buildBigHeap(int[] arr, int i, int length){ int temp = arr[i]; // 暂存当前节点的值 for (int j = i * 2 + 1; j < length; j = j * 2 + 1) { // j为当前节点的左子节点, j+1是右子节点,如果右大于左,那么j指向右节点 if((j + 1) < length && arr[j] < arr[j + 1]) j += 1; // 当前节点小于子节点 if(temp < arr[j]){ arr[i] = arr[j]; i = j; }else{ break; } } arr[i] = temp; } }