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

题目来源:蓝桥云课

不用辅助储存空间

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;
            }
        }
相关推荐
-dzk-12 分钟前
【堆】LC 347.前 K 个高频元素
算法·堆
H.莓飛22 分钟前
【数据结构】栈_OJ题
linux·数据结构·算法·centos
Zootopia62635 分钟前
多架 eVTOL集群排班调度方案思考
人工智能·算法·数学建模·matlab·动态规划·无人机·evtol
ZealSinger37 分钟前
Spring7 RestTemplate弃用迁移
java·spring·后端开发·restclient
和裕1 小时前
年度框架直供 vs 零散按需采购:定制纸箱采购成本、交付与服务核心区别全对比
大数据·运维·网络·人工智能·算法
朝朝辞暮i1 小时前
C++ 第 13 课:值传递 —— 为什么函数里改了,外面却没变?
java·c++·算法
弹简特1 小时前
【Java项目-企悦抽】16-抽奖模块01-获取活动完整信息接口实现
java·开发语言·状态模式·springboot
淡海水1 小时前
02-02-原理篇-分代GC
算法·unity·c#·游戏引擎·.net·gc
泡茶喝茶写代码2 小时前
A股量化数据工程:从 REST 接口到策略信号(第 1 篇):指数列表与实时行情接入
java·python·股票数据api·股票数据·股票数据api接口·股票api数据接口·股票量化数据接口
Sarvartha2 小时前
接口基础知识
java·开发语言