数组相关
求数组交集
Set
let a = new Set([1, 2, 3]);
let b = new Set([4, 3, 2]);
let intersect = new Set([...a].filter((x) => b.has(x))); // set {2, 3}
Map
- 新增两个 Map,遍历两个数组,对各个元素计数,分别存入 Map
- 新增额外的交集数组,遍历第一个 Map,如果在第二个 Map 有对应 item,判断哪个数量 min 比较小,往交集数组新增 min 个 item
数组乱序
let arr = [1, 2, 3, 4, 5, 6];
arr.sort(() => Math.random() - 0.5);
上面这个并不是一个很公平的乱序方法,原因主要在于 v8 对 sort 的实现是基于插入排序(元素小于 10)或快排。可以用洗牌算法优化:
// Knuth Shuffle
function shuffle(arr) {
let m = arr.length;
while (m > 1) {
let index = Math.floor(Math.random() * m--);
[arr[m], arr[index]] = [arr[index], arr[m]];
}
return arr;
}
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组
// 说明: 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。 你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。
// 输入:
var nums1 = [1, 2, 3],
m = 3;
var nums2 = [2, 5, 6],
n = 3;
// 输出: [1,2,2,3,5,6]
双指针
let merge = function (arr1, m, arr2, n) {
// 两个指针指向数组非空位置的末尾
let i = m - 1;
let j = n - 1;
// 第三个指针指向第一个数组的末尾 填充数据
let k = m + n - 1;
while (i >= 0 && j >= 0) {
let num1 = arr1[i];
let num2 = arr2[j];
if (num1 > num2) {
arr1[k] = num1;
i--;
} else {
arr1[k] = num2;
j--;
}
k--;
}
while (j >= 0) {
arr1[k] = arr2[j];
j--;
k--;
}
};
移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序
// 示例:
// 输入: [0,1,0,3,12]
// 输出: [1,3,12,0,0]
// 说明:
// 必须在原数组上操作,不能拷贝额外的数组。
// 尽量减少操作次数。
var moveZeroes = function (nums) {
if (nums.length < 1) return nums;
let slow = 0,
fast = 0;
while (fast < nums.length) {
// 快指针找到非 0 值时,告诉慢指针存一下
if (nums[fast] !== 0) {
nums[slow] = nums[fast];
// 慢指针存完后,往前走一步,准备存下一个(不一定存)
slow++;
}
fast++;
}
// 快指针遍历完数组后,nums[slow] 之前的,都是排序好的,nums[slow]之后(包括nums[slow]),都是0,所以都赋值为0
while (slow < fast) {
nums[slow] = 0;
slow++;
}
return nums;
};
reduce 实现 map
Array.prototype.myMap = function (fn, thisArg = []) {
if(typeof fn !== function){
throw new Error(`${fn} is not a function`);
}
return this.reduce((pre, cur, index, arr) => {
return pre.concat(fn.call(thisArg, cur, index, arr));
}, []);
};
var arr = [2, 3, 1, 5];
arr.myMap(function (item, index, arr) {
console.log(item, index, arr);
});
let res = arr.myMap((v) => v * 2);
console.log(res); // [4,6,2,10]