题设一:现有0到99,共计100个整数,各不相同,将所有数放入一个数组,随机排布。数组长度101,多余的数字是0到99其中任意一个数(唯一重复的数字)。
问题一:将这个重复的数字找出来。
【初始化条件】
//创建了一个101个整数的空间
//初始化了一个空间为101的数组,并对其进行了数据初始化
int[] arr = new int[101];
for(int i = 0;i<=99;i++){
arr[i] = i;
}
arr[100] = 69;
for(int x = 1;x<=10000;x++){
//随机排列
int num1 = (int)(Math.random()*101);
int num2 = (int)(Math.random()*101);
//arr[num1] arr[num2] 两个数据互换位置
int temp = arr[num1];
arr[num1] = arr[num2];
arr[num2] = temp;
}
【方法一】
itcast:
for(int i = 0;i<arr.length;i++){
//取出第一个数字,然后与后面的所有数字比对
//arr[i]与后面所有的数字比 arr[i+1]向后的数字
for(int j =i+1;j<arr.length;j++){
if(arr[i]==arr[j]){
System.out.println("找到了重复的数字"+arr[i]);
break itcast;
}
}
}
【方法二】
//0到99 ,其中有一个重复的数字
//将数组中所有的数字加一起0到99的和+重复的那个数字
//将上述结果减去0到99的和 就可以得到重复的数字了
int sum = 0;
//将数组中所有的数字都加一起
for(int i = 0;i<arr.length;i++){
sum+=arr[i];
}
//使用上面的结果减0到99
for(int i = 0;i<=99;i++){
sum-=i;
}
System.out.println(sum);
//方案二如果计算的数字特别多,比如有3万亿个数据,超出了数据类型
【方法三】(推荐)
//0^1^2^3..^m...^99^m ^0^1^2^3.....^99 = x
//使用数组中的第一个数据,异或后面的所有数据
for(int i = 1;i<arr.length;i++){
arr[0]=arr[0]^arr[i];
}
for(int i = 0;i<=99;i++){
arr[0]=arr[0]^i;
}
System.out.println(arr[0]);