使用java在不与0比较的情况下对负和正进行分区

0 java collections data-structures

您将获得一个由 n 个整数组成的数组,包括负数和正数。您需要将数组划分为正数和负数。将数组的所有正整数添加到一个数组(或任何数据结构),并将所有负整数添加到另一个数组(或任何数据结构)。如果输入数组的第一个元素是正数,则在第一行输出中按给定顺序打印所有正数,然后在第二行输出中按给定顺序打印所有负数,反之亦然.

笔记:

将 0 视为正数。

输出中的正数和负数应遵循给定数组中元素的顺序。输出的每一行中的每个数字都应该用空格分隔。

如果数组只包含正数,则在第一行打印正数,在第二行打印“数组没有负数”。

如果数组只包含负数,则在第一行打印负数,在第二行打印“数组没有正数”。

输入:

10

2 6 9 -1 -4 10 -7 3 5 -8

输出:

2 6 9 10 3 5

-1 -4 -7 -8

解释:

数组的第一个元素是 2,它是一个正数,所以在第一行打印数组的所有正数,然后在下一行打印所有负数

在这里,我所做的工作 50%(在单独的数组列表中对 -ve 和 +ve 整数进行分区),剩下的 50% 我们必须检查是否在我们的数组中,如果没有给出正数,然后打印给定的消息,反之亦然反之

 import java.util.*;

public class Source {
    public static void main(String[] args) {
       Scanner sc = new Scanner(System.in);
       int n = sc.nextInt();
       int arr[] = new int[n];
       for (int i = 0; i < n; i++) {
           arr[i] = sc.nextInt();
       }
       partitionNegativeAndPositive(n, arr);
    }
    
    static  boolean oppositeSign(int x,int y) {
        return ((x^y)<0);
    }
    static void printList(ArrayList<Integer> list) {
        String result="";
        for(int i=0;i<list.size();i++) {
            result+=list.get(i)+" ";
        }
        System.out.println(result);
    }

    // Method to partition negative and positive numbers without comparing with 0
    static void partitionNegativeAndPositive(int n, int arr[]) {
        
      // Write your code here
        ArrayList<Integer> a = new ArrayList<Integer>();
        ArrayList<Integer> b = new ArrayList<Integer>();
        //push first element
        a.add(arr[0]);
        // Now put all elements of same sign
        // in a[] and opposite sign in b[]
        for(int i=1;i<n;i++) {
            if(oppositeSign( a.get(0), arr[i])) {
                b.add(arr[i]);
            }else {
                a.add(arr[i]);
            }
        }
        if(arr[0]>=0) {
            if(a.size()>=0) {
                printList(a);
            }else {
                System.out.println("Array doesn't have positive numbers");
            }
            if(b.size()>=0) {
                printList(b);
            }else {
                System.out.println("Array doesn't have negative numbers");
            }
        }else {
            if(b.size()>=0) {
                printList(b);
            }else {
                System.out.println("Array doesn't have negative numbers");
            }
            if(a.size()>=0) {
                printList(a);
            }else {
                System.out.println("Array doesn't have positive numbers");
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请帮助我在这段代码中做错的地方

Hol*_*ger 5

你的oppositeSign方法是个好主意,但它仍然与零进行比较。当您认为int值的最左位表示符号并且可以提取以用作分区的索引时,您可以不进行比较而执行分区操作。此外,Java 不是 C。您不需要传递数组长度,因为 Java 数组知道它们的长度。此外,您应该避免使用声明语法int arr[],而是使用int[] arr, 以遵循惯用的类型名称模式。

static void partitionNegativeAndPositive(int[] arr) {
    ArrayList<Integer> pos = new ArrayList<>(), neg = new ArrayList<>();

    List<List<Integer>> posNeg = Arrays.asList(pos, neg);

    for(int i: arr) posNeg.get(i >>> 31).add(i);

    if(pos.isEmpty()) {
        System.out.println("Array doesn't have positive numbers");
    }
    else {
        printList(pos);
    }
    if(neg.isEmpty()) {
        System.out.println("Array doesn't have negative numbers");
    }
    else {
        printList(neg);
    }
}
Run Code Online (Sandbox Code Playgroud)

i >>> 31将符号位移动到位置零,导致正数为零,负数为一。这可以用作通过Arrays.asList(pos, neg),创建的列表的索引,以添加到正确的分区。