
[LeetCode] 2149. Rearrange Array Elements by Sign
題目說明
給定一個由相同數量的正整數和負整數組成的偶數長度整數陣列 nums,你需要重新排列這個陣列的元素,使修改後的陣列滿足以下條件:
- 任意連續的兩個整數符號相反。
- 對於符號相同的所有整數,保留它們在 nums 中的順序。
- 重排後的陣列以正整數開頭。
請返回修改後滿足上述條件的陣列。
題目連結: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]。
解法一 :
這邊我依照直覺直接寫。
- 先區分正數和負數,並且各存入陣列當中
- 已經知道第一位數一定是正數,那第二位數就是負數,以此類堆…
- 最後就能將結果合併輸出
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;
}
解法二 :
這邊有參找網路上的對於這題的解法
- 先定義正數和負數陣列位置
- 宣告 result ,這是將結果返回的陣列
- 走訪 result 陣列
- 如果碰到是正數則將數字放入 result 且 p 位置 +2 , 否則 n 位置 +2
- 將結果輸出
這邊就沒直接宣告正數和負數的陣列,感覺 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;
}