【筆記】JavaScript版數據結構與算法——基礎算法之“排序類”(922. 按奇偶排序數組 II)


按奇偶排序數組 II

922. 按奇偶排序數組 II - 力扣(LeetCode)

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 所指的數。

本題難度不大,重點是理解好題意,雖然題意有些莫名其妙。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章