/** * @Auther: 么么 * @Date: 2023/5/9 - 05 - 09 - 22:12 * @Description: PACKAGE_NAME * @version: 1.0 */ //已知一个数组中有俩个数出现了奇数次,其余数出现偶数次,找出出现奇数次的俩个数 public class test03 { //这是一个main方法,是程序的入口: public static void main(String[] args) { int[] arr = {1, 5, 1, 14, 3, 3, 3, 3}; //设其中一个数为 result1 int result1 = 0; for (int n : arr) { result1 ^= n; } /** * 执行完for循环 result1= 5^14 result1 !=0 * 5 --> 1001 * 14 --> 1110 * 1001 * ^1110 * ------ * 0111 * * 因为result1不等于0 ,所以转为二进制,必有一位是为 1 * 所以要找的俩个数的二进制中 必有一位 一个数是1 一个数是0 * 假设是第2位 一个数是1 一个数是0 * 将数组中第2位上 是1 的做异或运算 得到其中一个数 */ //获得 rusult1 二进制位最右侧的1 //result1 --->0111 //~result1 取反 1000 //~result1+1 1001 //result1 & (~result1+1) //0111 & 1001 ->0001 int right = result1 & (~result1 + 1); int result2 = 0; for (int n : arr) { //判断数组中最右侧位为1的数 if ((right & n) == 1) { //让最右侧位为1的数作异或运算 result2 ^= n; } } //找到了result2设为b 而result1 = a^b // 所以 result1 = a^b ^b =a 就得到了俩个数 result1 = result1 ^ result2; System.out.println("一个数为:"+result1); System.out.println("另一个数为:"+result2); } }
标签:int,result2,个数,result1,数次,出现,数是 From: https://www.cnblogs.com/me-me/p/17386609.html