题目来源:蓝桥云课
不用辅助储存空间
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;
若不受题目限制:不用辅助储存空间
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;}}