算法主要注意以下两点:
- 运行时间
- 内存消耗
下面是第一个小算法
package test;
import org.junit.Test;
public class DemoTest {
/**
* 假设:现在有0-99 , 共计100个整数, 各不相同。将所有数字放入一个数组,随机排布。
* 数组长度101,多余的数字是从0-99之间的任意一个数字(唯一重复的数字)
* 问题:将这个重复的数字找出来
*/
@Test
public void test1(){
//1.创建长度101的数组,并对其进行数据初始化
int[] arr = new int[101];
for(int i=0;i<=99;i++){
arr[i]=i;
}
arr[100] = 69;
//2.把数据打乱, 随机排列一下
for(int i=0;i<111;i++){
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;
}
//测试一下我们组装的数据
// for(int i=0;i<101;i++){
// System.out.println(arr[i]);
// }
/**
*开始完成题目
*解决方案一
*缺点:速度太慢
*/
fornum:
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[j]);
break fornum;
}
}
}
/**
* 解决方案二:
* 0-99有一个重复的数字
* 将数组中所有的数字加一起的和 (0-99的和 + 重复数字)
* 将上述结果减去0-99的和 剩下的就是重复的数字
* 缺点:如果有三万亿个数字的话, 会超出数据类型的长度。会爆掉
*/
//1.求arr的和
int sum=0;
for(int i=0;i<=arr.length;i++){
sum += i;
}
//2.依次减去0-99
for(int i=0;i<=99;i++){
sum -=i;
}
System.out.println(sum);
/**
* 方案三:
* 使用异或^
* 0^1^2...99^m^0^1^2...^99 = m
*/
//使用数组中的第一个数据,异或后面所有的数据
for(int i=1;i<arr.length;i++){
arr[0] = arr[0]^arr[i];
}
//再异或一遍0-99的数字
for(int i=1;i<=99;i++){
arr[0] = arr[0]^i;
}
System.out.println(arr[0]);
}
}