扁平化数组
就是将一个多层的数组拍扁,比如[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;
}
}