2013-10-28 87 views
0

我試圖編寫一個方法,可以重新排列整數從偶到奇數的隊列。重新排列整數隊列

使得[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

我不認爲你的方法可以工作;而不是使用單個幫助程序堆棧,我認爲您需要使用兩個幫助程序隊列(一個保存偶數值,一個保存奇數值)。 – ruakh

+1

附錄/更正:由於您事先檢查了您的隊列大小,並基於此進行迭代,而不是基於隊列是否爲非空,您可以將隊列本身用作我之前提到的「助手隊列」之一評論。使用這種方法,你可以用堆棧替換另一個幫助器隊列,前提是你願意兩次運行整個操作(以便元素以正確的順序結束)。所以,如果你願意的話,你實際上可以只用一個助手堆棧來做到這一點:這只是一個痛苦。 – ruakh

回答

0

排序是可以的,但需要O(n log n)的時間,當你可以很容易地在O(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); 
} 
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; 
    } 
} 

使

  • 如果它們都是奇數或偶數,他們相比於價值
  • 如果是奇數,b是不是,它的位置偏移落後
  • 如果是連和b不是,它的位置前移

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

0

創建臨時隊列(或列表)。迭代主隊列,刪除奇怪元素並將它們放到臨時隊列中。最後將所有列表元素添加到主隊列中