重新排列整数队列

时间:2013-10-28 01:17:22

标签: 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 (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);
    }
}
}

3 个答案:

答案 0 :(得分:0)

Java有Comparator就是这样的事情。把它们放在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不是,则其位置向后移动
  • 如果a是偶数且b不是,则其位置向前移动

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

排序没问题,但是当你可以很容易地在O(n)中执行此操作时需要O(n log n)时间。我认为这就是Evgeniy Dorofeev也提出的建议:

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);
}