当前位置: 首页 > 知识库问答 >
问题:

在java中使用移位运算符对数组中的负和正进行分区

孟彦
2023-03-14

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

注意事项:

将0视为正数。

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

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

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

输入:

10个

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

输出:

2 6 9 10 3 5

在这里,我已经完成了代码,但它根本没有打印消息“Array没有正数”。我哪里出错了?

import java.util.*;

public class Graded3 {
    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 void partitionNegativeAndPositive(int n, int[] arr) {
       ArrayList<Integer> pos = new ArrayList<Integer>();
       ArrayList<Integer> neg = new ArrayList<Integer>();
       int first = 1+(arr[0]>>31)-(-arr[0]>>31);
       if (first==0) {
         List<List<Integer>> posNeg = Arrays.asList(neg, pos);
         for(int i: arr) posNeg.get(i >>> 31).add(i);
       }
       else {
         List<List<Integer>> posNeg = Arrays.asList(pos, neg);
         for(int i: arr) posNeg.get(i >>> 31).add(i);
       }

       if(pos.isEmpty()==false) {
         for(int i =0; i<pos.size(); i++)
           System.out.print(pos.get(i) + " ");
         System.out.println("");
       }

       if(neg.isEmpty()==false) {
         for (int i = 0; i < neg.size(); i++)
           System.out.print(neg.get(i) + " ");
         System.out.println("");
       }
       if(pos.isEmpty()) {
         System.out.println("Array doesn't have positive numbers");
       }
       if(neg.isEmpty()) {
         System.out.println("Array doesn't have negative numbers");
       }

}
}

共有1个答案

苗运珧
2023-03-14

你把事情复杂化了:

public static void partition(int[] data) {
    List<Integer> posList = new ArrayList<>();
    List<Integer> negList = new ArrayList<>();
    
    for (int i : data) {
        if (i < 0) {
            negList.add(i);
        } else {
            posList.add(i);
        }
    }
    
    StringBuilder output = new StringBuilder();
    if (posList.isEmpty()) {
        output.append("Array doesn't have any positive numbers.").append(System.lineSeparator());
    } else {
        for (int i : posList) {
            output.append(i).append(' ');
        }
        output.append(System.lineSeparator());
    }
    
    if (negList.isEmpty()) {
        output.append("Array doesn't have any negative numbers.").append(System.lineSeparator());
    } else {
        for (int i : negList) {
            output.append(i).append(' ');
        }
        output.append(System.lineSeparator());
    }
    
    System.out.println(output);
}

public static void main(String [] args) throws IOException {
    partition(new int[] {2, 6, 9, -1, -4, 10, -7, 3, 5, -8});
}
 类似资料:
  • 问题内容: 当遇到按位移位运算符时,我遇到了一个有趣的场景。如果第二个操作数为负,按位移位运算如何工作?。 即,<< << b,“ <<”将a中的位模式向左移动b位。但是,如果b为负数,在运行时是否应该出错? 我能够成功运行以下代码,但我不知道它是如何工作的? 输入项 结果 “ a”的ASCII码为97。有人可以帮助我了解其工作原理吗? 问题答案: 但是,如果b为负数,在运行时是否应该出错? 不符

  • 你会得到一个由n个整数组成的数组,包括负整数和正整数。您需要将它们划分为两个不同的数组,而不直接将任何元素与0、1、-1或任何其他固定值进行比较。将0视为正数。如果arr[0]是正数,则在第一行输出中按给定顺序打印所有正数,然后在第二行输出中按给定顺序打印所有负数,反之亦然。注意:如果数组只包含正数,那么在第一行打印正数,在第二行打印“数组没有负数”。如果数组只包含负数,则在第一行打印负数,在第二

  • 我正试图将Java代码移植到C#中,但我遇到了与无符号shift right运算符有关的奇怪错误>>>通常代码: 这样的事情在C#中怎么可能呢? 我希望尽可能地保留代码语义,因为它是一个相当复杂的代码体。

  • 问题内容: 我正在尝试了解轮班经营者,但收获不多。当我尝试执行以下代码时 我得到以下 有人可以解释一下吗? 问题答案: 将二进制2()向左移动11次。因此:1000000000000 将二进制2()向左移动22次。因此: 现在,int为4字节,因此为32位。因此,当你偏移33时,它等效于偏移1。因此:100

  • 问题内容: 考虑以下代码(其中byteIndex是一个int): 这会产生错误 编译时(必需字节,位于int)。 代码 编译良好。 这是什么问题,我该如何解决第一个示例以允许将整数值按int值进行移位? 编辑:根据评论,这是一个更完整的示例: 和给出的错误是: 问题答案: 将您的行转换为此:- 您的RHS是一个整数,您需要将其转换为字节。 上面的代码将正常工作..不管有没有的到 因此,您也可以:-

  • 给定一个正数和负数(没有零)的数组,我必须以这样的方式排列它们:正数和负数应该连续排列。 正数和负数的数量可能不相等,也就是说,如果没有正数(或负数),那么所有剩余的负数(或正数)都会追加到数组的末尾。 顺序很重要,即如果输入数组是,那么输出数组应该是。代码在O(n)中完成,而不使用另一个数组。 这是我在java中的解决方案,我再次测试了几个案例并成功了。但是,我不确定这是否在O(n)时间内运行。