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)
请帮助我在这段代码中做错的地方
你的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),创建的列表的索引,以添加到正确的分区。
| 归档时间: |
|
| 查看次数: |
1321 次 |
| 最近记录: |