摘自传智播客公开课
package test; /* * 传智播客公开课笔记 */ public class Arithmetic { public static void main(String[] args) { /* 题设:现有0到99,共计100个整数,各不相同,将所有数放入一个 数组,随机排布。数组长度101,多余的数字是0到99其中任 意一个数(唯一重复的数字) 问题:将这个重复的数字找出来 */ /* * 构造题目 */ int[] num = new int[101]; for(int i=0;i<num.length;i++) { num[i] = i; } num[100] = 55; for(int i=0;i<10000;i++) { int num1 = (int)(Math.random()*101); int num2 = (int)(Math.random()*101); int temp; temp = num[num1]; num[num1] = num[num2]; num[num2] = temp; } //题目测试 for(int i = 0;i<num.length;i++) { System.out.print(num[i] + "\t"); if((i+1)%10==0) System.out.println(); } //问题解决 /* * 方案一 */ feng: for(int i = 0;i<num.length;i++) { for(int j = i+1;j<num.length;j++) { if(num[j]==num[i]) { System.out.println("\n" + "方案一找出来的数字为:" + num[i]); break feng; } } } //缺点:随着基数的增大,计算次数可能会成倍增大 /* * 方案二 */ int sum = 0; for(int i=0;i<num.length;i++) { sum += num[i]; } for(int i=0;i<100;i++) { sum -= i; } System.out.println("\n" + "方案二找出来的数字为:" + sum); //缺点:如果计算的数字特别多,比如有3万亿个数据,超出了数据类型 /* * 方案三 */ int test = num[0]; for(int i=1;i<num.length;i++) { test = test^num[i]; } for(int i=0;i<100;i++) { test = test^i; } System.out.println("\n" + "方案三找出来的数字为:" + test); } }