数组类型
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() - startTimelet total = 0while (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)};
