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

题目来源:蓝桥云课

不用辅助储存空间

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 中索引为 i 和 j 的两个元素。它借助一个临时变量 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;
            }
        }
相关推荐
机器人零零壹1 小时前
技术白皮书:iRobotCAM如何解决机器人激光切割应用中的核心难点,从CAD离线编程到双目视觉定位与轨迹自适应提升复杂空间曲线切割的精度、效率与柔性化水平
人工智能·算法
AI你一生一世2 小时前
不止于时序存储:DolphinDB 如何成为 AI 时代的工业智能底座
java·人工智能·struts·时序数据库·工业智能·dolphindb·ai基础设施
云-缩影2 小时前
拆解 AI 图像生成应用的后端架构:ECS、OSS 和大模型 API 怎么配合
java·spring boot·后端
瑞克-桑切斯3 小时前
7、MySQL 慢查询排查与优化实战指南
java·服务器·数据库
ZhengEnCi4 小时前
大模型的分类到底怎么分:从基础模型到推理模型、从通用到专用的完整图谱
算法
取名真是5 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
罗西的思考5 小时前
【轻量化复刻大模型 / KIMI K3】KDA 模块交互式演示
人工智能·算法·机器学习
nm_zfyjt7 小时前
信息流广告投放优化实践:线索成本评估模型与转化链路重构(家装建材案例)
算法·重构·内蒙古朋友圈广告服务商·内蒙古朋友圈获客
海的透彻7 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言
code2cat7 小时前
Java工具篇之Gradle:用任务图组织构建与交付
java·开发语言·单元测试·gradle