顺序遍历,用动态列表,定长列表数据结构,用双指针,单指针,位运算技巧,4 解法求解《1470. 重新排列数组》,用 python 双重循环嵌套列表完成一行解

2022-08-29 01:04:18
顺序遍历,用动态列表([](push 多个 / append) / slice(append 多个) / ArrayList(add) / List(Add) / vector(push_back)),定长列表数据结构,用双指针,单指针,位运算技巧,4 解法求解《1470. 重新排列数组》,用 python 双重循环嵌套列表完成一行解。

例题

1470. 重新排列数组

给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。
请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。
示例 1:
输入:nums = [2,5,1,3,4,7], n = 3
输出:[2,3,5,4,1,7]
解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]
示例 2:
输入:nums = [1,2,3,4,4,3,2,1], n = 4
输出:[1,4,2,3,3,2,4,1]
示例 3:
输入:nums = [1,1,2,2], n = 2
输出:[1,2,1,2]
提示:
1 <= n <= 500
nums.length == 2n
1 <= nums[i] <= 10^3

答案

顺序遍历 · 动态列表(可变列表)

var shuffle = function(nums, n) {
  const r = []
  for (let i = 0; i < n; i++) {
    r.push(nums[i], nums[i + n])
  }
  return r
};
function shuffle(nums: number[], n: number): number[] { 
  const r = []
  for (let i = 0; i < n; i++) {
    r.push(nums[i], nums[i + n])
  }
  return r
};
class Solution {
  function shuffle($nums, $n) {
    $r = [];
    for ($i = 0; $i < $n; $i++) {
      array_push($r, $nums[$i], $nums[$i + $n]);
    }
    return $r;
  }
}
func shuffle(nums []int, n int) []int {
  r := []int{}
  for i := 0; i < n; i++ {
    r = append(r, nums[i], nums[i + n])
  }
  return r
}
class Solution {
  public int[] shuffle(int[] nums, int n) {
    List<Integer> r = new ArrayList<Integer>(n << 1);
    for (int i = 0; i < n; i++) {
      r.add(nums[i]);
      r.add(nums[i + n]);
    }
    return r.stream().mapToInt(i -> i).toArray();
  }
}
public class Solution {
  public int[] Shuffle(int[] nums, int n) {
    List<int> r = new List<int>(n << 1);
    for (int i = 0; i < n; i++) {
      r.Add(nums[i]);
      r.Add(nums[i + n]);
    }
    return r.ToArray();
  }
}
class Solution {
public:
  vector<int> shuffle(vector<int>& nums, int n) {
    vector<int> r;
    for (int i = 0; i < n; i++) {
      r.push_back(nums[i]);
      r.push_back(nums[i + n]);
    }
    return r;
  }
};
class Solution:
  def shuffle(self, nums: List[int], n: int) -> List[int]:
    r = []
    for i in range(n):
      r.append(nums[i])
      r.append(nums[i + n])
    return r
class Solution: # 双重 for 嵌套列表:第二重用列表
  def shuffle(self, nums: List[int], n: int) -> List[int]:
    return [num for i in range(n) for num in [nums[i], nums[i + n]]]
class Solution: # 双重 for 嵌套列表:第二重用元组
  def shuffle(self, nums: List[int], n: int) -> List[int]:
    return [num for i in range(n) for num in (nums[i], nums[i + n])]

顺序遍历 · 定长数组(定长列表) · 双指针

var shuffle = function(nums, n) {
  const r = new Uint16Array(n << 1)
  for (let i = j = 0; i < n; i++) {
    r[j++] = nums[i]
    r[j++] = nums[i + n] 
  }
  return r
};
function shuffle(nums: number[], n: number): number[] { 
  const r = new Array(n << 1)
  for (let i = 0, j = 0; i < n; i++) {
    r[j++] = nums[i]
    r[j++] = nums[i + n]
  }
  return r
};
class Solution {
  function shuffle($nums, $n) {
    $r = array_fill(0, $n << 1, 0);
    for ($i = $j = 0; $i < $n; $i++) {
      $r[$j++] = $nums[$i];
      $r[$j++] = $nums[$i + $n];
    }
    return $r;
  }
}
func shuffle(nums []int, n int) []int {
  r := make([]int, n << 1)
  for i, j := 0, 0; i < n; i, j = i + 1, j + 2 {
    r[j] = nums[i]
    r[j + 1] = nums[i + n]
  }
  return r
}
class Solution {
  public int[] shuffle(int[] nums, int n) {
    int[] r = new int[n << 1];
    for (int i = 0, j = 0; i < n; i++) {
      r[j++] = nums[i];
      r[j++] = nums[i + n];
    }
    return r;
  }
}
public class Solution {
  public int[] Shuffle(int[] nums, int n) {
    int[] r = new int[n << 1];
    for (int i = 0, j = 0; i < n; i++) {
      r[j++] = nums[i];
      r[j++] = nums[i + n];
    }
    return r;
  }
}
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
  int* r = malloc(sizeof(int) * numsSize);
  for (int i = 0, j = 0; i < n; i++) {
    r[j++] = nums[i];
    r[j++] = nums[i + n];
  }
  *returnSize = numsSize;
  return r;
}
class Solution {
public:
  vector<int> shuffle(vector<int>& nums, int n) {
    vector<int> r(n << 1);
    for (int i = 0, j = 0; i < n; i++) {
      r[j++] = nums[i];
      r[j++] = nums[i + n];
    }
    return r;
  }
};
class Solution:
  def shuffle(self, nums: List[int], n: int) -> List[int]:
    r, j = [0] * (n << 1), 0
    for i in range(n):
      r[j], r[j + 1] = nums[i], nums[i + n]
      j += 2
    return r

顺序遍历 · 定长数组(定长列表) · 单指针

var shuffle = function(nums, n) {
  const r = new Uint16Array(n << 1)
  for (let i = 0; i < n; i++) {
    r[i << 1] = nums[i]
    r[(i << 1) + 1] = nums[i + n] 
  }
  return r
};
function shuffle(nums: number[], n: number): number[] {
  const r = new Array(n << 1)
  for (let i = 0; i < n; i++) {
    r[i << 1] = nums[i]
    r[(i << 1) + 1] = nums[i + n]
  }
  return r
};
class Solution {
  function shuffle($nums, $n) {
    $r = array_fill(0, $n << 1, 0);
    for ($i = 0; $i < $n; $i++) {
      $r[$i << 1] = $nums[$i];
      $r[($i << 1) + 1] = $nums[$i + $n];
    }
    return $r;
  }
}
func shuffle(nums []int, n int) []int {
  r := make([]int, n << 1)
  for i := 0; i < n; i++ {
    r[i << 1] = nums[i]
    r[i << 1 + 1] = nums[i + n]
  }
  return r
}
class Solution {
  public int[] shuffle(int[] nums, int n) {
    int[] r = new int[n << 1];
    for (int i = 0; i < n; i++) {
      r[i << 1] = nums[i];
      r[(i << 1) + 1] = nums[i + n];
    }
    return r;
  }
}
public class Solution {
  public int[] Shuffle(int[] nums, int n) {
    int[] r = new int[n << 1];
    for (int i = 0; i < n; i++) {
      r[i << 1] = nums[i];
      r[(i << 1) + 1] = nums[i + n];
    }
    return r;
  }
}
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
  int* r = malloc(sizeof(int) * numsSize);
  for (int i = 0; i < n; i++) {
    r[i << 1] = nums[i];
    r[(i << 1) + 1] = nums[i + n];
  }
  *returnSize = numsSize;
  return r;
}
class Solution {
public:
  vector<int> shuffle(vector<int>& nums, int n) {
    vector<int> r(n << 1);
    for (int i = 0; i < n; i++) {
      r[i << 1] = nums[i];
      r[(i << 1) + 1] = nums[i + n];
    }
    return r;
  }
};
class Solution:
  def shuffle(self, nums: List[int], n: int) -> List[int]:
    r = [0] * (n << 1)
    for i in range(n):
      r[i << 1], r[(i << 1) + 1] = nums[i], nums[i + n]
    return r

顺序遍历 · 定长数组 · 单指针 · 位运算 · 原地更改
  1. 数组元素 1 <= nums[i] <= 10^3,小于 1024,即 210 次方
  2. 设置掩码为 (1 << 10) - 1,用掩码 & 运算取原值,将运算后的结果存储至前 10 位

var shuffle = function(nums, n) {
  const mask = (1 << 10) - 1
  for (let i = 0; i < n; i++) {
    nums[i << 1] |= (nums[i] & mask) << 10
    nums[(i << 1) + 1] |= (nums[i + n] & mask) << 10
  }
  for (let i = 0; i < n << 1; i++) {
    nums[i] >>= 10
  }
  return nums
};
var shuffle = function(nums, n) {
  const mask = (1 << 10) - 1
  for (let i = 0; i < n; i++) {
    nums[i << 1] |= (nums[i] & mask) << 10
    nums[(i << 1) + 1] |= (nums[i + n] & mask) << 10
  }
  return nums.map(num => num >> 10)
};
function shuffle(nums: number[], n: number): number[] {
  const mask = (1 << 10) - 1
  for (let i = 0; i < n; i++) {
    nums[i << 1] |= (nums[i] & mask) << 10
    nums[(i << 1) + 1] |= (nums[i + n] & mask) << 10
  }
  for (let i = 0; i < n << 1; i++) {
    nums[i] >>= 10
  }
  return nums
};
class Solution {
  function shuffle($nums, $n) {
    $mask = (1 << 10) - 1;
    for ($i = 0; $i < $n; $i++) {
      $nums[$i << 1] |= ($nums[$i] & $mask) << 10;
      $nums[($i << 1) + 1] |= ($nums[$i + $n] & $mask) << 10;
    }
    foreach($nums as $i => $num) {
      $nums[$i] = $num >> 10;
    }
    return $nums;
  }
}
class Solution {
  function shuffle($nums, $n) {
    $mask = (1 << 10) - 1;
    for ($i = 0; $i < $n; $i++) {
      $nums[$i << 1] |= ($nums[$i] & $mask) << 10;
      $nums[($i << 1) + 1] |= ($nums[$i + $n] & $mask) << 10;
    }
    return array_map(function($num) {
      return $num >>= 10;
    }, $nums);
  }
}
func shuffle(nums []int, n int) []int {
  mask := 1 << 10 - 1
  for i := 0; i < n; i++ {
    nums[i << 1] |= nums[i] & mask << 10
    nums[i << 1 + 1] |= nums[i + n] & mask << 10
  }
  for i, _ := range nums {
    nums[i] >>= 10
  }
  return nums
}
class Solution {
  public int[] shuffle(int[] nums, int n) {
    int mask = (1 << 10) - 1;
    for (int i = 0; i < n; i++) {
      nums[i << 1] |= (nums[i] & mask) << 10;
      nums[(i << 1) + 1] |= (nums[i + n] & mask) << 10;
    }
    for (int i = 0; i < n << 1; i++) {
      nums[i] >>= 10;
    }
    return nums;
  }
}
public class Solution {
  public int[] Shuffle(int[] nums, int n) {
    int mask = (1 << 10) - 1;
    for (int i = 0; i < n; i++) {
      nums[i << 1] |= (nums[i] & mask) << 10;
      nums[(i << 1) + 1] |= (nums[i + n] & mask) << 10;
    }
    for (int i = 0; i < n << 1; i++) {
      nums[i] >>= 10;
    }
    return nums;
  }
}
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
  int mask = (1 << 10) - 1;
  for (int i = 0; i < n; i++) {
    nums[i << 1] |= (nums[i] & mask) << 10;
    nums[(i << 1) + 1] |= (nums[i + n] & mask) << 10;
  }
  for (int i = 0; i < numsSize; i++) {
    nums[i] >>= 10;
  }
  *returnSize = numsSize;
  return nums;
}
class Solution {
public:
  vector<int> shuffle(vector<int>& nums, int n) {
    int mask = (1 << 10) - 1;
    for (int i = 0; i < n; i++) {
      nums[i << 1] |= (nums[i] & mask) << 10;
      nums[(i << 1) + 1] |= (nums[i + n] & mask) << 10;
    }
    for (int i = 0; i < n << 1; i++) {
      nums[i] >>= 10;
    }
    return nums;
  }
};
class Solution:
  def shuffle(self, nums: List[int], n: int) -> List[int]:
    mask = (1 << 10) - 1
    for i in range(n):
      nums[i << 1] |= (nums[i] & mask) << 10
      nums[(i << 1) + 1] |= (nums[i + n] & mask) << 10
    for i in range(n << 1):
      nums[i] >>= 10
    return nums

两端收缩遍历,双指针构造列表,求解《667. 优美的排列 II》
两端收缩遍历,双指针构造列表,求解《667. 优美的排列 II》
双指针,单指针,原地交换,用临时变量,加减法,指针交换变量。求解《剑指 Offer 21. 调整数组顺序使奇数位于偶数前面》
双指针,单指针,原地交换,用临时变量,加减法,指针交换变量。求解《剑指 Offer 21. 调整数组顺序使奇数位于偶数前面》
自定义排序,二分查找(upper_bound / lower_bound + 双指针 / 传递回调函数)2 算法 4 解法,slice / array_slice / subList / Arrays.copyOfRange / GetRange / memcpy 截取列表,求解《658. 找到 K 个最接近的元素》
自定义排序,二分查找(upper_bound / lower_bound + 双指针 / 直接找左边界)2 算法 4 解法,slice / array_slice / subList / Arrays.copyOfRange / GetRange / memcpy 截取列表,传递函数,求解《658. 找到 K 个最接近的元素》