知识点:
1.
nextInt(x)会产生[0,x)范围
2. 若使用普通方式对数组进行输出:
System.out.println(arr+"\n");
会奇怪地得到,打印的内容是[I@7852e922这种地址值
想要得到有效的输出,应该使用:(当然需要import java.util.Arrays;)
System.out.println(Arrays.toString(arr));
3.数组的长度 (arr.length) 是个数,但其下标从0开始(而不是1),则最后一个下标应该是(length-1)
4.数组的交换源码:
public static void swap(int[] data,int a,int b ) {
int temp=0;
temp=data[a];
data[a]=data[b];
data[b]=temp;
}
解析:
【题设的准备工作】
【构建数组】
int N=11;
int[] arr =new int[N];
for(int i=0;i<arr.length-1;i++)
{arr[i]=i+1;}
//arr的长度是N,也就是11
//此时的arr是[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 0]
【最后一个数】
arr[arr.length-1]=new Random().nextInt(N-1)+1;
//在范围是[0,10)+1 [1,11)内的数赋值给最后一个数
int index =new Random().nextInt(N);//下标在[0,11)
//再找一个随机下标
【交换】
swap(arr,index,arr.length-1);
【核心代码】
int x1=0;
for(int i=1;i<=N-1;i++)
{ x1=(x1^i);}
//显然x1只与随机数无关,只和i相关
//x1是1到10 连续异或,为下一步备用
for(int i=0;i<N;i++)
{ x1=x1^arr[i];}
// 而arr=(1到10 +多余的数)
//实现[1到10的连续异或]^[1到10的连续异或^多余的数]
System.out.println(x1);
考虑题目的话将N改为1001即可
若不考虑题设,引入辅助空间
//出辅助空间
int [] helper =new int [N];
for(int i=0;i<N;i++)
{ helper[arr[i]]++;}
//arr[i]里面是1到1000的计数,把数放作下标,下标放作helper中去,对计数进行加
for(int i=0;i<N;i++)
{
if(helper[i]==2)
{
System.out.println(i);
break;
}
}
//计数等于2,就打印i
完整代码:
无辅助空间
import java.util.Arrays;
import java.util.Random;
public class a{
public static void main(String[] args) {
int N =11;
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);
swap(arr,index,arr.length-1);
System.out.println(Arrays.toString(arr));
int x1=0;
int x2=0;
for(int i=0;i<=N-1;i++) {
x1=x1^i;
}
System.out.print("测试一"+x1+" ");
for(int i=0;i<N;i++) {
x1=x1^arr[i];
x2=x2^arr[i];
}
System.out.println("测试二"+x1+"\n");
}
public static void swap(int[] data,int a,int b ) {
int temp=0;
temp=data[a];
data[a]=data[b];
data[b]=temp;
}
}
import java.util.Random;
public class a
{
public static void main(String[] args) {
int N=11;
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;//[0,10)+1
int index =new Random().nextInt(N);//[0,11)
swap(arr,index,arr.length-1);
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+" ");
}
int [] helper =new int [N];
for(int i=0;i<N;i++)
{
helper[arr[i]]++;
}
for(int i=0;i<N;i++)
{
if(helper[i]==2)
{
System.out.println(i);
break;
}
}
}
public static void swap(int[] data, int a, int b) {
int temp;
temp = data[a]; data[a] = data[b]; data[b] = temp;
}
}