位运算[找出唯一成对的数]

题目来源:蓝桥云课

不用辅助储存空间

java 复制代码
 import java.util.Random;
 public class T_01 {
      public class Util {
          public static void swap(int[] arr, int i, int j) {
              int temp = arr[i];
              arr[i] = arr[j];
              arr[j] = temp;
          }
          public static void print(int[] arr) {
              for (int i = 0; i < arr.length; i++) {
                  System.out.print(arr[i]+" ");
              }
              System.out.println();
          }
      }
 ​
     public static void main(String[] args) {
         int n=1001;
         int[] arr=new int[n];
         for (int i = 0; i < arr.length-1; i++) {
             arr[i]=i+1;
         }
 //        最后一个是随机数
         arr[arr.length-1]=new Random().nextInt(n-1)+1;
 ​
 //        最后一个数的随机下标
         int index=new Random().nextInt(n);
         Util.swap(arr, index, arr.length-1);
         Util.print(arr);
         int x1=0;
 //        进行位运算
         for (int i = 1; i <= n-1; i++) {
             x1=(x1^i);
         }
         for (int i = 0; i < n; i++) {
             x1= (x1^arr[i]);
         }
         System.out.println(x1);
     }
 }
  • swap 方法:此方法的作用是交换数组 arr 中索引为 ij 的两个元素。它借助一个临时变量 temp 来保存其中一个元素的值,进而实现交换操作。

  • print 方法:该方法用于打印数组 arr 中的所有元素,元素之间以空格分隔,打印完所有元素后会换行。

  • arr[arr.length - 1] = new Random().nextInt(n - 1) + 1;:把数组的最后一个元素设置为从 1 到 n - 1 之间的随机整数。

位运算原理

异或运算(^)具有以下特性:

  • 任何数与 0 异或结果为其本身,即 a ^ 0 = a

  • 任何数与自身异或结果为 0,即 a ^ a = 0

  • 异或运算满足交换律和结合律,即 a ^ b ^ c = a ^ c ^ b

n=11为例(重复数为2):

【1,2,3,4,5,6,7,2,9,10,8】

复制代码
 x1=0;
 for (int i = 1; i <= n-1; i++) {
             x1=(x1^i);
         }

x1=0^1^2^3^4^5^6^7^8^9^10;

复制代码
 for (int i = 0; i < n; i++) {
             x1= (x1^arr[i]);
         }

i=0;

x1=0^1^2^3^4^5^6^7^8^9^10^0;

x1=1^2^3^4^5^6^7^8^9^10;

i=1;

x1=1^2^3^4^5^6^7^8^9^10^1;

x1=2^3^4^5^6^7^8^9^10;

i=2;

x1=2^3^4^5^6^7^8^9^10^2;

x1=3^4^5^6^7^8^9^10;

......

i=10

x1=2^8^8;

x1=2;

若不受题目限制:不用辅助储存空间

java 复制代码
int[] con=new int[n];
        for (int i = 0; i < n; i++) {
            con[arr[i]]++;
        }
        for (int i = 0; i < n; i++) {
            if(con[i]==2){
                System.out.println(i);
                break;
            }
        }
相关推荐
卡尔特斯2 小时前
Android Kotlin 项目代理配置【详细步骤(可选)】
android·java·kotlin
白鲸开源2 小时前
Ubuntu 22 下 DolphinScheduler 3.x 伪集群部署实录
java·ubuntu·开源
ytadpole3 小时前
Java 25 新特性 更简洁、更高效、更现代
java·后端
纪莫3 小时前
A公司一面:类加载的过程是怎么样的? 双亲委派的优点和缺点? 产生fullGC的情况有哪些? spring的动态代理有哪些?区别是什么? 如何排查CPU使用率过高?
java·java面试⑧股
JavaGuide4 小时前
JDK 25(长期支持版) 发布,新特性解读!
java·后端
用户3721574261354 小时前
Java 轻松批量替换 Word 文档文字内容
java
白鲸开源4 小时前
教你数分钟内创建并运行一个 DolphinScheduler Workflow!
java
CoovallyAIHub4 小时前
中科大DSAI Lab团队多篇论文入选ICCV 2025,推动三维视觉与泛化感知技术突破
深度学习·算法·计算机视觉
Java中文社群4 小时前
有点意思!Java8后最有用新特性排行榜!
java·后端·面试
代码匠心5 小时前
从零开始学Flink:数据源
java·大数据·后端·flink