找反复数字问题
public class Algo1 { public static void main(String[] args) { int[] arr = new int[101]; create(arr);//构建乱序数组 method1(arr); method2(arr); for(int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } } /** * 方案1: * 题目中指明了0~99这99个数是肯定会出现的。那么非常easy。仅仅要我们遍历数组。然后求和。将和减去0累加到99的和,之差即为反复的数 */ public static void method1(int[] arr) { int sum = 0; for(int i = 0; i < arr.length; i++) { sum += arr[i]; } int constant = 0; for(int j = 0; j < 100; j++) { constant += j; } int value = sum - constant; System.out.println("反复数字为:"+value); } /** * 方案2: * 能够利用异或运算的特性: a^b^b = a * 即一个数两次异或还有一个数还等于这个数本身 * -------------------------- * 仅仅要我们遍历数组,让第一个数与后面全部数异或,将结果再依次与0~99全部数异或结果即为反复的数 */ public static void method2(int[] arr) { 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]); } /** * 创建题设所要求的数组 */ public static void create(int[] arr) { for(int i = 0; i < arr.length; i++) { arr[i] = i; } arr[100] = 93;//反复的数字 int temp,num1,num2; //乱序 for(int j = 0; j < 1000; j++) { num1 = (int) (Math.random()*101); num2 = (int) (Math.random()*101); temp = arr[num1]; arr[num1] = arr[num2]; arr[num2] = temp; } } }
数组中的数字是乱序的,如今从中随机取出一个数字并替换成0~99中的还有一个数字,
试找到这个反复数字
public class Algo2 { public static void main(String[] args) { int[] arr = new int[100]; create(arr); for(int i = 0; i < 100; i++) { System.out.print(arr[i]+" "); } System.out.println("\n"); System.out.println("反复数字为:"+method(arr)); } /** * 解决方式: * 构建一个和原数组大小一致的暂时数组,用于记录每一个索引位所代表的数据出现的次数, * 比方temp[5] = 2,表示5这个数字出现了两次。* 通过遍历一次数组就可以得到结果. */ public static int method(int[] arr) { int[] temp = new int[arr.length]; for(int i = 0; i < arr.length;i++) { temp[arr[i]]++; if(temp[arr[i]] == 2) { return arr[i]; } } return -1; } /** * 构建题设所要求的数组 */ public static void create(int[] arr) { for(int i = 0; i < arr.length; i++) { arr[i] = i; } int num1,num2,temp; for(int i = 0; i < 1000; i++) { num1 = (int) (Math.random()*100); num2 = (int) (Math.random()*100); temp = arr[num1]; arr[num1] = arr[num2]; arr[num2] = temp; } do { num1 = (int) (Math.random()*100); num2 = (int) (Math.random()*100); }while(num1 == num2); arr[num1] = arr[num2]; System.out.println("反复数字为:"+arr[num1]); } }