数组类型
1:求数组的交集/并集/差集
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5];
// 交集
let intersection = arr1.filter(item => arr2.includes(item));
// 两个数组的并集
let union = arr1.concat(arr2.filter(item => !arr1.includes(item)));
let union1 = [...new Set(arr1.concat(arr2))]
// a相对b的差集
let diffA2B = arr1.filter(item => !arr1.filter(item => arr2.includes(item)).includes(item));
let diffA2B1 = arr1.concat(arr2).filter(item=> arr1.includes(item) && !arr2.includes(item));
// b相对a的差集
let diffB2A = arr2.filter(item => !arr1.filter(item => arr2.includes(item)).includes(item));
let diffB2A1 = arr1.concat(arr2).filter(item=> arr2.includes(item) && !arr1.includes(item));
提升求多个数组的交集
const arr1 = [1, 2, 3, 4];
const arr2 = [3, 4, 5];
const arr3 = [3, 6, 7];
let intersectionMore = (...args) =>{
return args.reduce((prev,next)=>{
console.log(prev, "---", next);
return prev.filter(item => next.includes(item))
})
}
console.log(intersectionMore(arr1, arr2, arr3))
2:数组移动K位操作
[1,23,2,8,9] 移动 k=2位 => [8, 9, 1, 23, 2]
[12,3,0,23,67,8,9] 移动 k=3位 => [67, 8, 9, 12, 3, 0, 23]
let arr = [12,3,0,23,67,8,9]
3:求数组中只出现一次的值
[2,3,3] => 2
[1,2,1,2,3] => 3
let nums = [2,2,1];
var singleNumber = function(nums) {
let map = new Map();
nums.reduce((prev,cur) =>{
if(prev.has(cur)){
let num = prev.get(cur);
num ++;
prev.set(cur, num)
}else{
prev.set(cur, 1)
}
return prev;
},map)
for(let [i,j] of map.entries()){
console.log(i,j);
if(j===1){
return i
}
}
};
时间类型
1:求两个日期之间有效的日期
“2016-02-26” 和”2016-03-02” 之间=>
[ ‘2016-2-26’,
‘2016-2-27’,
‘2016-2-28’,
‘2016-2-29’,
‘2016-3-1’,
‘2016-3-2’
]
function rangeDay (day1, day2) {
const result = []
const dayTimes = 24*60*60*1000 //一天的时间
const startTime = day1.getTime()
const range = day2.getTime() - startTime
let total = 0
while (total <= range) {
result.push(new Date(startTime + total).toLocaleDateString().replace(/\//g, '-'))
total += dayTimes
}
return result
};
正则类型
递归思想
1:爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
解题思路:对于n阶台阶,可以看成走了n-1阶基础上再跨1阶 + 走了n-2阶基础上再跨2阶
第一种方法:执行速度快,内存占用大
var climbStairs = function(n,a=1,b=1) {
// 对于n阶台阶,可以看成走了n-1阶基础上再跨1阶 + 走了n-2阶基础上再跨2阶
// 第一种,执行速度快,内存占用大
if(n<=1)
return a;
return climbStairs(n-1,a+b,a);
};
第二种方法:执行速度稍慢,内存占用小
let total = new Map();
var climbStairs = function(n,a=1,b=1) {
if(n<=2) {
total.set(n, n);
return n
}
if(total.has(n)){
return total.get(n)
}
total.set(n, climbStairs(n-1) + climbStairs(n-2))
return total.get(n)
};