1. 程式人生 > >LeetCode-905. 按奇偶排序陣列

LeetCode-905. 按奇偶排序陣列

題目

給定一個非負整數陣列 A,返回一個由 A 的所有偶數元素組成的陣列,後面跟 A 的所有奇數元素。

你可以返回滿足此條件的任何陣列作為答案。

示例:

輸入:[3,1,2,4] 輸出:[2,4,3,1] 輸出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3] 也會被接受。

解答

  • 最簡單的方式就是對陣列進行一次"排序", 這個排序自定義大小規則, 我們設定所有偶數都小於奇數,偶數等於偶數, 奇數等於奇數, 按照這個規則, 對陣列進行排序, 排序完成之後就能夠得到題目想要的解答
  • 更好的方式是使用快速排序, 這種相當於將陣列分割成兩部分, 很符合快速排序的partition操作, 所以只需要對陣列進行一次partition操作, 就可以將陣列按照奇偶進行排序了, 快速排序相關參考 :
    https://blog.csdn.net/love905661433/article/details/83144734

下面使用程式碼展示用快速排序的方式解答這個問題 :

package num901_1000;

/**
 * 給定一個非負整數陣列 A,返回一個由 A 的所有偶數元素組成的陣列,後面跟 A 的所有奇數元素。
 * 你可以返回滿足此條件的任何陣列作為答案。
 * @author xuxiumeng
 *
 */
class Solution {
    
    /**
     *  交換兩個元素位置, 輔助程式碼
     * @param arr
     * @param i
     * @param j
     */
private static void swap(int[] arr, int i, int j){ int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } /** * 返回一個數組是否是偶數, 輔助函式 * @return */ private static boolean isEven(int num){ return num % 2 == 0; } /****************解題思路*********************/
/* * 由於是將陣列分廠奇數和偶數的兩部分, 這樣就可以參考使用對陣列使用快速排序的思想 * 對整個陣列進行一次partition操作, 得到的就是目標陣列 */ public int[] sortArrayByParity(int[] A) { int l = 0; // 設定A[0~l-1]左閉右閉區間都是偶數 int i = 0; // 設定A[l~i)左閉右開區間都是奇數 for (i = 0; i < A.length; i++) { if (isEven(A[i])) { swap(A, i, l); l++; } } return A; } }