扁平化数组

@温叶博客  May 28, 2023

扁平化数组

就是将一个多层的数组拍扁,比如[1, [2, [3, [4, 5]]], 6]拍成[1, 2, 3, 4, 5, 6]

递归写法

这个没啥难度,就是定义一个结果数组,然后循环原数组,如果元素是数组则递归。

function _flat(nestNums: Array<number[] | number>, flatNums: number[] = []) {
  for (let nestNum of nestNums) {
    if (Array.isArray(nestNum)) {
      _flat(nestNum, flatNums);
    } else {
      flatNums.push(nestNum);
    }
  }
  return flatNums;
}

function flatByRecursive(nestNums: Array<number[] | number>) {
  return _flat(nestNums, []);
}

通过栈实现

这个也不难,需要注意好顺序,原数组是pop,结果数组是unshift

function flatByStack(nestNums: Array<number[] | number>) {
  const stack = [...nestNums];
  const result: number[] = [];

  while (stack.length > 0) {
    const item = stack.pop()!;
    if (Array.isArray(item)) {
      stack.push(...item);
    } else {
      result.unshift(item);
    }
  }

  return result;
}

打乱数组

字面意思,将一个数组打乱。实现方法就是从后向前,依次将当前元素和剩余元素中随机的一个进行交换

class Solution {
  private nums: number[];

  constructor(nums: number[]) {
    this.nums = nums;
  }

  reset(): number[] {
    return this.nums;
  }

  shuffle(): number[] {
    const copyNums = [...this.nums];
    // 从右向左 每次取剩余没比较数字 随机替换
    for (let i = copyNums.length - 1; i >= 0; i--) {
      const randomIndex = Math.floor(Math.random() * (i + 1));
      [copyNums[randomIndex], copyNums[i]] = [copyNums[i], copyNums[randomIndex]];
    }
    return copyNums;
  }
}

添加新评论