3个方案 分别如下 (int数组小的时候性能没有什么区别的 但是当int数组非常大的时候 就视自己情况选用了)
不用申请内存空间 时间复杂度为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?"该数组 存在 正负数":"该数组 不存在 正负数"); }需要去再创个包装类 把int数值存起来 重写hashcode和equals方法 遍历添加包装类对象到set中去 最后面判断Set的有效个数是否为数组的长度 来推算是否存在正反数 1.要再定义包装类,重写方法 -->麻烦 2.要new Set 还要new 大量的包装类 空间占用高
这个方案太麻烦了,此处就不去具体实现了 有兴趣的可以自己去实现下~~
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("该数组 不存在 正负数"); } }欢迎关注❤️、点赞👍、转发📣!