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

题目来源:蓝桥云课

不用辅助储存空间

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;
            }
        }
相关推荐
红石榴花生油7 分钟前
Docker + Nginx 部署 Java 项目(JAR 包 + WAR 包)实战笔记
java·tomcat·maven
带刺的坐椅10 分钟前
Solon AI 开发学习 - 1导引
java·ai·openai·solon·mcp
sg_knight12 分钟前
RabbitMQ 中的预取值(prefetch)详解:如何真正提升消费端性能?
java·spring boot·spring·spring cloud·消息队列·rabbitmq·预取值
Dxxyyyy21 分钟前
零基础学JAVA--Day34(Map接口+HashTable+HashMap+TreeSet+TreeMap+开发中如何选择集合实现类?(重要))
java·开发语言
橘颂TA22 分钟前
【剑斩OFFER】算法的暴力美学——除自身以外数组的乘积
算法·leetcode·职场和发展·结构与算法
源码之家23 分钟前
机器学习:基于python租房推荐系统 预测算法 协同过滤推荐算法 房源信息 可视化 机器学习-线性回归预测模型 Flask框架(源码+文档)✅
大数据·python·算法·机器学习·数据分析·线性回归·推荐算法
鑫—萍1 小时前
C/C++精品算法——双指针(1)
c语言·c++·算法
铭哥的编程日记1 小时前
深入浅出蓝桥杯:算法基础概念与实战应用(三)搜索
算法·蓝桥杯·深度优先
2501_941111891 小时前
低延迟系统C++优化
开发语言·c++·算法
spencer_tseng1 小时前
Tomcat Source Code Distributions
java·tomcat