我尝试编写一个可以将整数队列从偶数重排为奇数的方法。
这样[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);
}
}
}
答案 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;
}
}
这样
使用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);
}