数组类型

1:求数组的交集/并集/差集

  1. const arr1 = [1, 2, 3, 4];
  2. const arr2 = [3, 4, 5];
  3. // 交集
  4. let intersection = arr1.filter(item => arr2.includes(item));
  5. // 两个数组的并集
  6. let union = arr1.concat(arr2.filter(item => !arr1.includes(item)));
  7. let union1 = [...new Set(arr1.concat(arr2))]
  8. // a相对b的差集
  9. let diffA2B = arr1.filter(item => !arr1.filter(item => arr2.includes(item)).includes(item));
  10. let diffA2B1 = arr1.concat(arr2).filter(item=> arr1.includes(item) && !arr2.includes(item));
  11. // b相对a的差集
  12. let diffB2A = arr2.filter(item => !arr1.filter(item => arr2.includes(item)).includes(item));
  13. let diffB2A1 = arr1.concat(arr2).filter(item=> arr2.includes(item) && !arr1.includes(item));

提升求多个数组的交集

  1. const arr1 = [1, 2, 3, 4];
  2. const arr2 = [3, 4, 5];
  3. const arr3 = [3, 6, 7];
  4. let intersectionMore = (...args) =>{
  5. return args.reduce((prev,next)=>{
  6. console.log(prev, "---", next);
  7. return prev.filter(item => next.includes(item))
  8. })
  9. }
  10. 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]

  1. let arr = [12,3,0,23,67,8,9]

3:求数组中只出现一次的值

[2,3,3] => 2
[1,2,1,2,3] => 3

  1. let nums = [2,2,1];
  2. var singleNumber = function(nums) {
  3. let map = new Map();
  4. nums.reduce((prev,cur) =>{
  5. if(prev.has(cur)){
  6. let num = prev.get(cur);
  7. num ++;
  8. prev.set(cur, num)
  9. }else{
  10. prev.set(cur, 1)
  11. }
  12. return prev;
  13. },map)
  14. for(let [i,j] of map.entries()){
  15. console.log(i,j);
  16. if(j===1){
  17. return i
  18. }
  19. }
  20. };

时间类型

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’
]

  1. function rangeDay (day1, day2) {
  2. const result = []
  3. const dayTimes = 24*60*60*1000 //一天的时间
  4. const startTime = day1.getTime()
  5. const range = day2.getTime() - startTime
  6. let total = 0
  7. while (total <= range) {
  8. result.push(new Date(startTime + total).toLocaleDateString().replace(/\//g, '-'))
  9. total += dayTimes
  10. }
  11. return result
  12. };

正则类型

递归思想

1:爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
解题思路:对于n阶台阶,可以看成走了n-1阶基础上再跨1阶 + 走了n-2阶基础上再跨2阶
第一种方法:执行速度快,内存占用大

  1. var climbStairs = function(n,a=1,b=1) {
  2. // 对于n阶台阶,可以看成走了n-1阶基础上再跨1阶 + 走了n-2阶基础上再跨2阶
  3. // 第一种,执行速度快,内存占用大
  4. if(n<=1)
  5. return a;
  6. return climbStairs(n-1,a+b,a);
  7. };

第二种方法:执行速度稍慢,内存占用小

  1. let total = new Map();
  2. var climbStairs = function(n,a=1,b=1) {
  3. if(n<=2) {
  4. total.set(n, n);
  5. return n
  6. }
  7. if(total.has(n)){
  8. return total.get(n)
  9. }
  10. total.set(n, climbStairs(n-1) + climbStairs(n-2))
  11. return total.get(n)
  12. };