【笔记】JavaScript版数据结构与算法——基础算法之“排序类”(922. 按奇偶排序数组 II)

文章目录

  • 按奇偶排序数组 II
    • 1.题目
      • 题目模板
    • 2.思路分析
    • 3.所用到的方法
    • 4.题解及优化
      • 课程解法
      • 其他小伙伴的解法


按奇偶排序数组 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 所指的数。

本题难度不大,重点是理解好题意,虽然题意有些莫名其妙。。

你可能感兴趣的:(【笔记】JavaScript版数据结构与算法——基础算法之“排序类”(922. 按奇偶排序数组 II))