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

题目来源:蓝桥云课

不用辅助储存空间

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;
            }
        }
相关推荐
武昌库里写JAVA14 分钟前
JAVA面试汇总(四)JVM(一)
java·vue.js·spring boot·sql·学习
C++、Java和Python的菜鸟31 分钟前
第六章 统计初步
算法·机器学习·概率论
Cx330❀31 分钟前
【数据结构初阶】--排序(五):计数排序,排序算法复杂度对比和稳定性分析
c语言·数据结构·经验分享·笔记·算法·排序算法
散11241 分钟前
01数据结构-Prim算法
数据结构·算法·图论
起个昵称吧1 小时前
线程相关编程、线程间通信、互斥锁
linux·算法
落霞的思绪1 小时前
Java设计模式详细解读
java·开发语言·设计模式
Java小白程序员1 小时前
Spring Framework:Java 开发的基石与 Spring 生态的起点
java·数据库·spring
myzzb2 小时前
基于uiautomation的自动化流程RPA开源开发演示
运维·python·学习·算法·自动化·rpa
拂晓银砾2 小时前
Java数据结构-栈
java·数据结构
甄超锋2 小时前
Java Maven更换国内源
java·开发语言·spring boot·spring·spring cloud·tomcat·maven