按奇偶排序數組 II
1.題目
給定一個非負整數數組 A, A 中一半整數是奇數,一半整數是偶數。
對數組進行排序,以便當 A[i] 爲奇數時,i 也是奇數;當 A[i] 爲偶數時, i 也是偶數。
你可以返回任何滿足上述條件的數組作爲答案。
示例:
輸入:[4,2,5,7]
輸出:[4,5,2,7]
解釋:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也會被接受。
提示:
- 2 <= A.length <= 20000
- A.length % 2 == 0
- 0 <= A[i] <= 1000
題目模板
/**
* @param {number[]} A
* @return {number[]}
*/
var sortArrayByParityII = function(A) {
};
2.思路分析
見題解
3.所用到的方法
見題解
4.題解及優化
課程解法
let sortArrayByParityII = (A) => {
// 按升序排序
A.sort((a, b) => a - b)
// 聲明一個空數組用來存儲奇偶排序後的數組
let result = []
// 奇數、偶數位下標指針
let odd = 1
let even = 0
// 對數組進行遍歷
A.forEach(item => {
if (item % 2 === 1) {
result[odd] = item
odd += 2
} else {
result[even] = item
even += 2
}
})
return result
}
其他小夥伴的解法
以下兩種解法異曲同工思路也基本相同:
let sortArrayByParityII = (A) => {
let j = 1
let temp // 臨時變量
// 找到第一個偶數i,不爲偶數的
for (let i = 0; i <= A.length - 2; i += 2, j += 2) {
if (A[i] % 2 === 0) {
i += 2
continue
}
temp = A[i]
// 找到第一個奇數數j,不爲奇數的
while (j <= A.length - 1) {
if (A[j] % 2 === 1) {
j += 2
} else {
break
}
}
A[i] = A[j]
A[j] = temp
}
return A
}
可以直接在原數組上操作:題目限定所給數組半奇半偶,所以當找到了第一個偶數位置上非偶數時,一定會有一個奇數位置上非奇數,找出它們來對掉值。
let sortArrayByParityII = (A) => {
for (let i = 0, j = 1; i < A.length; i += 2) {
if (A[i] % 2 === 0) continue
while (A[j] % 2 === 1) j += 2;
[A[i], A[j]] = [A[j], A[i]]
}
return A
}
題目要求是讓偶數部分下標 i 的所有數都是偶數,奇數部分下標 i 的所有數都是奇數
當發現偶數部分下標對應的值不是偶數時,不斷增加指向奇數部分的指針,直到找到一個偶數,然後交換指針 i,j 所指的數。
本題難度不大,重點是理解好題意,雖然題意有些莫名其妙。。