Sword56-I——数组中数字出现的次数 方法1——位运算 思路: 利用异或性质,将数组中所有元素异或一遍,得到的res即为两个出现一次的数字乘积再利用res & (~res + 1)找出最低位上的1重新遍历数组将所有该位上包含1的数字再次异或,得到的结果即为其中出现一次的数字将当前结果与之前的结果进行异或得出另一个数字 特殊情况与临界分析:无终止条件:无步骤: 定义两个结果值foreach循环将数组中元素进行异或,得出一个结果利用n & (~n + 1)找出n最低位上的1对应的数字foreach循环将数组中最低位上的1对应的所有数字异或,得出另一个结果,即为其中一个数字后面结果与前面结果异或,得出结果即为另一个数字返回两个数字组成的数组 public int[] singleNumbers(int[] nums) { // 定义两个结果值 int res1 = 0, res2 = 0; // foeach循环 for (int num : nums) { res1 ^= num; } // 找出n最低位上1对应的数字 int tmp = res1 & (~res1 + 1); // foreach循环 for (int num : nums) { // 当该数字对应位上为1才将其进行异或 if ((num & tmp) != 0) { res2 ^= num; } } // res2已经为第一个只出现一次的数字 // res1异或res2,将消除res2,即得出另一个只出现一次的数字 res1 ^= res2; // 返回两个数组成的数组 return new int[]{res1, res2}; }