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; } }