Java 重新排列整数队列

Java 重新排列整数队列,java,stack,queue,Java,Stack,Queue,我正在尝试编写一个方法,可以将整数队列从偶数重新排列为奇数 使[3,5,4,17,6,83,1,84,16,37]类似于[4,6,84,16,3,5,17,83,1,37] 但是我现在有点困了,有人能帮我吗。这是我到目前为止得到的 public void rearrange(Queue<Integer> q) {     Stack<Integer> s = new Stack<Integer>();     int size = q.size(); for

我正在尝试编写一个方法,可以将整数队列从偶数重新排列为奇数

使[3,5,4,17,6,83,1,84,16,37]类似于[4,6,84,16,3,5,17,83,1,37]

但是我现在有点困了,有人能帮我吗。这是我到目前为止得到的

public void rearrange(Queue<Integer> q) {
    Stack<Integer> s = new Stack<Integer>();
    int size = q.size();
for (int i = 0; i < size; i++) {
    int n = q.remove();
    if (n % 2 == 1 || n % 2 == -1) {
        q.add(n);
    } 

    if( n % 2 == 0) {
        q.add(n);
    }
}
}
public void重排(队列q){
堆栈s=新堆栈();
int size=q.size();
对于(int i=0;i
Java有
比较器
,正好用于这类事情。将它们放入
java.util.List
中。编写一个比较器,类似于:

class OddEvenComparator implements Comparator<Integer> {
  public int compare (Integer a, Integer b) {
    boolean aOdd = (a % 2) != 0;
    boolean bOdd = (b % 2) != 0;
    return aOdd == bOdd ? a.compareTo(b) : aOdd ? -1 : 1;
  }
}
类比较器实现比较器{
公共整数比较(整数a、整数b){
布尔aOdd=(a%2)!=0;
布尔bOdd=(b%2)!=0;
返回aOdd==bOdd?a。与(b)相比:aOdd?-1:1;
}
}
所以

  • 如果它们都是奇数或偶数,则在值上进行比较
  • 如果a是奇数而b不是,则其位置向后移动
  • 如果a为偶数,b为非偶数,则其位置向前移动

使用
Collections.sort(列表,new OddEvenComparator())
进行排序。

创建临时队列(或列表)。在主队列上迭代,删除奇数元素并将它们放入临时队列。最后,将所有列表元素添加到主队列中

排序是可以的,但这需要O(n logn)时间,而在O(n)中这样做非常容易。我认为这也是Evgeniy Dorofev提出的:

public static void rearrange(Queue<Integer> q) {
    Queue<Integer> tmp = new LinkedList<>();

    // Remember size and rearrange that many items.
    int size = q.size();

    for (int count = 0; count < size; count++) {
        Integer head = q.poll();

        // Even items go on the end of the original queue, odd to temp.
        (head % 2 == 0 ? q : tmp).offer(head);
    }
    // Glue temp queue of odd values onto original which is all even.
    q.addAll(tmp);
}
公共静态无效重排(队列q){
队列tmp=newlinkedlist();
//记住大小并重新排列许多项目。
int size=q.size();
对于(int count=0;count
我认为你的方法行不通;与使用单个帮助器堆栈不同,我认为您需要使用两个帮助器队列(一个用于保存偶数值,一个用于保存奇数值)。补充/更正:由于您事先检查队列大小,并基于此进行迭代,而不是基于队列是否为非空,因此您可以将队列本身用作“帮助器队列”之一我在先前的评论中提到。使用这种方法,您可以用堆栈替换另一个助手队列,前提是您愿意将整个操作运行两次(以便元素以正确的顺序结束)。所以,如果您愿意,您实际上可以使用一个助手堆栈来完成这项工作:这只是一种痛苦。