判断一个int数组中是否存在相反数

本文介绍了三种不同的方法来判断一个大型int数组中是否存在相反数:1) 双重for循环判断,虽然简单但效率较低;2) 使用Set存储并判断,需要额外的空间和复杂的实现;3) 自定义简单的哈希表算法,时间和空间效率较高。作者推荐在实际应用中根据需求选择方案3。
摘要由CSDN通过智能技术生成

判断一个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

欢迎关注❤️、点赞👍、转发📣!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值