双指针,单指针,原地交换,用临时变量,加减法,指针交换变量。求解《剑指 Offer 21. 调整数组顺序使奇数位于偶数前面》

2022-09-01 02:38:57
双指针,单指针,原地交换,用临时变量,加减法,指针交换变量。求解《剑指 Offer 21. 调整数组顺序使奇数位于偶数前面》


## 例题

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数在数组的前半部分,所有偶数在数组的后半部分。

示例:
输入:nums = [1,2,3,4]
输出:[1,3,2,4]
注:[3,1,2,4] 也是正确的答案之一。
提示:
0 <= nums.length <= 50000
0 <= nums[i] <= 10000

答案

双指针 · 两端收缩
  1. 奇数指针:之前都是奇数
  2. 偶数指针:之后都是偶数(> 奇数指针)

var exchange = function(nums) {
  let odd = 0, even = nums.length - 1
  while (odd < even) {
    while (odd < even && (nums[odd] & 1)) odd++
    while (odd < even && (nums[even] & 1) === 0) even--
    swap(nums, odd++, even--)
  }
  return nums
};
const swap = (nums, a, b) => {
  const t = nums[a]
  nums[a] = nums[b]
  nums[b] = t
}
var exchange = function(nums) {
  let odd = 0, even = nums.length - 1
  while (odd < even) {
    while (odd < even && (nums[odd] & 1)) odd++
    while (odd < even && (nums[even] & 1) === 0) even--
    swap(nums, odd++, even--)
  }
  return nums
};
const swap = (nums, a, b) => { // 加减法交换变量
  nums[b] = nums[a] + nums[b] - (nums[a] = nums[b])
}
function exchange(nums: number[]): number[] {
  let odd = 0, even = nums.length - 1
  while (odd < even) {
    while (odd < even && (nums[odd] & 1)) odd++
    while (odd < even && (nums[even] & 1) === 0) even--
    swap(nums, odd++, even--)
  }
  return nums
};
function swap(nums: number[], a: number, b: number) {
  const t = nums[a]
  nums[a] = nums[b]
  nums[b] = t
}
class Solution {
  function swap(&$a, &$b) { // 交换指针
    $t = $a;
    $a = $b;
    $b = $t;
  }
  function exchange($nums) {
    $odd = 0;
    $even = count($nums) - 1;
    while ($odd < $even) {
      while ($odd < $even && ($nums[$odd] & 1)) $odd++;
      while ($odd < $even && ($nums[$even] & 1) === 0) $even--;
      $this->swap($nums[$odd++], $nums[$even--]);
    }
    return $nums;
  }
}
class Solution {
  function exchange($nums) { // list 与 array 交换
    $odd = 0;
    $even = count($nums) - 1;
    while ($odd < $even) {
      while ($odd < $even && ($nums[$odd] & 1)) $odd++;
      while ($odd < $even && ($nums[$even] & 1) === 0) $even--;
      list($nums[$odd], $nums[$even]) = array($nums[$even], $nums[$odd]);
      $even--;
      $odd++;
    }
    return $nums;
  }
}
func swap(a *int, b *int) { // 交换指针 + 临时变量
  t := *a;
  *a = *b;
  *b = t;
}
func exchange(nums []int) []int {
  odd, even := 0, len(nums) - 1
  for odd < even {
    for odd < even && nums[odd] & 1 == 1 {
      odd++
    }
    for odd < even && nums[even] & 1 == 0 {
      even--
    }
    swap(&nums[odd], &nums[even])
    odd++
    even--
  }
  return nums
}
func swap(a, b *int) { // 交换指针
  *a, *b = *b, *a
}
func exchange(nums []int) []int {
  odd, even := 0, len(nums) - 1
  for odd < even {
    for odd < even && nums[odd] & 1 == 1 {
      odd++
    }
    for odd < even && nums[even] & 1 == 0 {
      even--
    }
    swap(&nums[odd], &nums[even])
    odd++
    even--
  }
  return nums
}
func exchange(nums []int) []int { // 直接交换
  odd, even := 0, len(nums) - 1
  for odd < even {
    for odd < even && nums[odd] & 1 == 1 {
      odd++
    }
    for odd < even && nums[even] & 1 == 0 {
      even--
    }
    nums[odd], nums[even] = nums[even], nums[odd]
  }
  return nums
}
class Solution {
  public int[] exchange(int[] nums) {
    int odd = 0, even = nums.length - 1;
    while (odd < even) {
      while (odd < even && (nums[odd] & 1) == 1) odd++;
      while (odd < even && (nums[even] & 1) == 0) even--;
      swap(nums, odd++, even--);
    }
    return nums;
  }
  public void swap(int[] nums, int a, int b) {
    int t = nums[a];
    nums[a] = nums[b];
    nums[b] = t;
  }
}
public class Solution {
  public int[] Exchange(int[] nums) {
    int odd = 0, even = nums.Length - 1;
    while (odd < even) {
      while (odd < even && (nums[odd] & 1) == 1) odd++;
      while (odd < even && (nums[even] & 1) == 0) even--;
      swap(nums, odd++, even--); 
    }
    return nums;
  }
  public void swap(int[] nums, int a, int b) {
    int t = nums[a];
    nums[a] = nums[b];
    nums[b] = t;
  }
}
void swap(int* a, int* b) { // 交换指针
  int t = *a;
  *a = *b;
  *b = t;
}
int* exchange(int* nums, int numsSize, int* returnSize){
  int odd = 0, even = numsSize - 1;
  while (odd < even) {
    while (odd < even && (nums[odd] & 1) == 1) odd++;
    while (odd < even && (nums[even] & 1) == 0) even--;
    swap(nums + odd++, nums + even--);
  }
  *returnSize = numsSize;
  return nums;
}
class Solution {
public:
  vector<int> exchange(vector<int>& nums) {
    int odd = 0, even = nums.size() - 1;
    while (odd < even) {
      while (odd < even && nums[odd] & 1) odd++;
      while (odd < even && (nums[even] & 1) == 0) even--;
      swap(nums[odd], nums[even]);
    }
    return nums;
  }
};
class Solution:
  def exchange(self, nums: List[int]) -> List[int]:
    odd, even = 0, len(nums) - 1
    while odd < even:
      while odd < even and nums[odd] & 1: odd += 1
      while odd < even and nums[even] & 1 == 0: even -= 1
      nums[odd], nums[even] = nums[even], nums[odd]
    return nums

单指针 · 顺序遍历
  1. 顺序遍历:找奇数,交换到奇数位指针
  2. 奇数位指针 + 1

var exchange = function(nums) {
  const n = nums.length
  let odd = 0
  for (let i = 0; i < n; i++) {
    if (nums[i] & 1) swap(nums, i, odd++)
  }
  return nums
};
const swap = (nums, a, b) => {
  const t = nums[a]
  nums[a] = nums[b]
  nums[b] = t
}
var exchange = function(nums) {
  const n = nums.length
  let odd = 0
  for (let i = 0; i < n; i++) {
    if (nums[i] & 1) swap(nums, i, odd++)
  }
  return nums
};
const swap = (nums, a, b) => { // 加减法交换变量
  nums[b] = nums[a] + nums[b] - (nums[a] = nums[b])
}
function exchange(nums: number[]): number[] {
  const n = nums.length
  let odd = 0
  for (let i = 0; i < n; i++) {
    if (nums[i] & 1) swap(nums, i, odd++)
  }
  return nums
};
function swap(nums: number[], a: number, b: number) {
  const t = nums[a]
  nums[a] = nums[b]
  nums[b] = t
}
class Solution {
  function swap(&$a, &$b) { // 交换指针
    $t = $a;
    $a = $b;
    $b = $t;
  }
  function exchange($nums) {
    $odd = 0;
    foreach ($nums as $i => $num) {
      if ($num & 1) $this->swap($nums[$i], $nums[$odd++]);
    }
    return $nums;
  }
}
class Solution {
  function exchange($nums) { // list 与 array 交换
    $odd = 0;
    foreach($nums as $i => $num) {
      if ($num & 1) {
        list($nums[$i], $nums[$odd]) = array($nums[$odd], $num);
        $odd++;
      }
    }
    return $nums;
  }
}
func swap(a, b *int) { // 交换指针 + 临时变量
  t := *a
  *a = *b
  *b = t
}
func exchange(nums []int) []int {
  odd := 0
  for i, num := range nums {
    if num & 1 == 1 {
      swap(&nums[i], &nums[odd])
      odd++
    }
  }
  return nums
}
func swap(a, b *int) { // 交换指针
  *a, *b = *b, *a
}
func exchange(nums []int) []int {
  odd := 0
  for i, num := range nums {
    if num & 1 == 1 {
      swap(&nums[i], &nums[odd])
      odd++
    }
  }
  return nums
}
func exchange(nums []int) []int { // 直接交换
  odd := 0
  for i, num := range nums {
    if num & 1 == 1 {
      nums[i], nums[odd] = nums[odd], nums[i]
      odd++
    }
  }
  return nums
}
class Solution {
  public int[] exchange(int[] nums) {
    int n = nums.length, odd = 0;
    for (int i = 0; i < n; i++) {
      if ((nums[i] & 1) == 1) swap(nums, i, odd++);
    }
    return nums;
  }
  public void swap(int[] nums, int a, int b) {
    int t = nums[a];
    nums[a] = nums[b];
    nums[b] = t;
  }
}
public class Solution {
  public int[] Exchange(int[] nums) {
    int n = nums.Length, odd = 0;
    for (int i = 0; i < n; i++) {
      if ((nums[i] & 1) == 1) swap(nums, i, odd++);
    }
    return nums;
  }
  public void swap(int[] nums, int a, int b) {
    int t = nums[a];
    nums[a] = nums[b];
    nums[b] = t;
  }
}
void swap(int* a, int* b) {
  int t = *a;
  *a = *b;
  *b = t;
}
int* exchange(int* nums, int numsSize, int* returnSize){
  int odd = 0;
  for (int i = 0; i < numsSize; i++) {
    if ((nums[i] & 1) == 1) swap(nums + i, nums + odd++);
  }
  *returnSize = numsSize;
  return nums;
}
class Solution {
public:
  vector<int> exchange(vector<int>& nums) {
    int n = nums.size(), odd = 0;
    for (int i = 0; i < n; i++) {
      if ((nums[i] & 1) == 1) swap(nums[i], nums[odd++]);
    }
    return nums;
  }
};
class Solution:
  def exchange(self, nums: List[int]) -> List[int]:
    odd = 0
    for i, num in enumerate(nums):
      if num & 1:
        nums[i], nums[odd] = nums[odd], nums[i]
        odd += 1
    return nums

用排序,快速选择 2 种算法分割数组或列表,传递回调函数,求解《1619. 删除某些元素后的数组均值》
用排序,快速选择 2 种算法,用 slice / array_slice / Arrays.copyOfRange / ToList().GetRange / memcpy / 新建 vector 指定指针分割列表,传递回调函数,求解《1619. 删除某些元素后的数组均值》
顺序遍历 + 二分查找算法,升序 或 降序 排序,5 解法求解《1608. 特殊数组的特征值》
顺序遍历 + 二分查找算法,升序 或 降序 排序,lower_bound / bisect_left / sort.Search 枚举 x,5 解法求解《1608. 特殊数组的特征值》
顺序遍历,栈,用 reduce / array_reduce / stream().reduce / Aggregate / accumulate 累积完成 1 行解,3 解法求解《1598. 文件夹操作日志搜集器》,
顺序遍历,栈,2 解法求解《1598. 文件夹操作日志搜集器》,用 reduce / array_reduce / stream().reduce / Aggregate / accumulate 累积完成 1 行解