[LeetCode] 2149. Rearrange Array Elements by Sign


題目說明

給定一個由相同數量的正整數和負整數組成的偶數長度整數陣列 nums,你需要重新排列這個陣列的元素,使修改後的陣列滿足以下條件:

  1. 任意連續的兩個整數符號相反。
  2. 對於符號相同的所有整數,保留它們在 nums 中的順序。
  3. 重排後的陣列以正整數開頭。

請返回修改後滿足上述條件的陣列。

題目連結:LeetCode - Rearrange Array Elements by Sign

範例測試資料說明

範例1:

輸入:nums = [3,1,-2,-5,2,-4]
輸出:[3,-2,1,-5,2,-4]
解釋: nums 中的正整數為 [3,1,2]。
負整數為 [-2,-5,-4]。
滿足所有條件的唯一可能重新排列方式是 [3,-2,1,-5,2,-4]。
其他方式如 [1,-2,2,-5,3,-4]、[3,1,2,-2,-5,-4]、[-2,3,-5,1,-4,2] 都是錯誤的,因為它們不滿足一個或多個條件。

範例2:

輸入:nums = [-1,1]
輸出:[1,-1]
解釋: nums 中只有一個正整數 1 和一個負整數 -1。
因此,將 nums 重新排列為 [1,-1]。

解法一 :

這邊我依照直覺直接寫。

  1. 先區分正數和負數,並且各存入陣列當中
  2. 已經知道第一位數一定是正數,那第二位數就是負數,以此類堆…
  3. 最後就能將結果合併輸出

Code 如下:

public int[] rearrangeArray(int[] nums) {
    int n = nums.length / 2;
    int[] nn = new int[n];
    int[] pn = new int[n];
    int nni = 0, pnj = 0;
    for (int num : nums) {
        if (num >= 0) {
            pn[pnj] = num;
            pnj++;
            continue;
        }
        nn[nni] = num;
        nni++;
    }
    nni = 0;
    pnj = 0;
    for (int i = 0; i < nums.length; i++) {
        if ((i + 1) % 2 == 0) {
            nums[i] = nn[nni];
            nni++;
            continue;
        }
        nums[i] = pn[pnj];
        pnj++;
    }
    return nums;
}

解法二 :

這邊有參找網路上的對於這題的解法

  1. 先定義正數和負數陣列位置
  2. 宣告 result ,這是將結果返回的陣列
  3. 走訪 result 陣列
  4. 如果碰到是正數則將數字放入 result 且 p 位置 +2 , 否則 n 位置 +2
  5. 將結果輸出

這邊就沒直接宣告正數和負數的陣列,感覺 code 也比較簡潔

Code 如下:

public int[] rearrangeArray(int[] nums) {
    int p = 0, n = 1;
    int[] result = new int[nums.length];
    for (int i = 0; i < result.length; i++) {
        if (nums[i] > 0) {
            result[p] = nums[i];
            p += 2;
            continue;
        }
        result[n] = nums[i];
        n += 2;
    }
    return result;
}

參考 :

Beats 100% Java solution with easiest explanation