判断一个int数组中是否存在相反数
3个方案 分别如下
(int数组小的时候性能没有什么区别的 但是当int数组非常大的时候 就视自己情况选用了)
方案1.双重for循环判断
不用申请内存空间 时间复杂度为O(n二次方)
public static void test1(){
//要检查是否存在正负数的数组
//假设有10W个正负随机数
int[] arr={1,1,2,3,5,6,0};
int in;
int out;
boolean flag=false;
m:for (int i = 0; i < arr.length; i++) {
out=arr[i];
n:for (int k = 0; k < arr.length; k++) {
in=arr[k];
if ((in+out)==0){ //0+0=0 -a+a=0
flag=true;
break m;
}
}
}
System.out.println(flag?"该数组 存在 正负数":"该数组 不存在 正负数");
}
方案2.遍历添加到set去
需要去再创个包装类 把int数值存起来 重写hashcode和equals方法
遍历添加包装类对象到set中去
最后面判断Set的有效个数是否为数组的长度 来推算是否存在正反数
1.要再定义包装类,重写方法 -->麻烦
2.要new Set 还要new 大量的包装类 空间占用高
这个方案太麻烦了,此处就不去具体实现了 有兴趣的可以自己去实现下~~
方案3.自己实现简单的hash表算法
1.相比方案1时间复杂度低 O(n)
2.相比方案2空间占用低 且 时间效率也更好
(方案3只要发现有正反数 立刻马上break跳出循环 返回结果)
public static void test3(){
//要检查是否存在正负数的数组
//假设有10W个随机数
int[] arr={1,1,2,3,5,6,-6};
//申请个同样容量的数组来当hash表
//int数组未赋值时 每个元素默认值为0
int[] hashArray=new int[arr.length];
int hash;
int currentActualValue;
int i;//记录遍历了数组多少次
int lastActualValue;
for (i = 0; i < arr.length; i++) {
//当前遍历真实数值大小 带正负号的
currentActualValue=arr[i];
//hash值==绝对值
hash = Math.abs(currentActualValue) % hashArray.length;
//0的相反数是0 只要有0出现就说明该数组有正负数
if (hash==0) {
break;
}else {
lastActualValue = hashArray[hash];
if ((currentActualValue+lastActualValue)==0){
break;
}
hashArray[hash]=currentActualValue;
}
}
if (i<arr.length){
System.out.println("该数组 存在 正负数");
}else {
System.out.println("该数组 不存在 正负数");
}
}
总结 推荐用方案1或方案2
欢迎关注❤️、点赞👍、转发📣!