每日笔记1(leetcode452+Generator函数与Thunk的异步运用)

一,Leetcode 452. 用最少数量的箭引爆气球

该题我没想到好的思路,所以看答案吧。。。
答案使用排序加贪心的算法完成,排序是按气球右端位置的大小升序。目的很简单,为了可以看到最短的那个。因为要保证所有的气球都被射到,那么应该先考虑右端最短的那个气球,因为他必须要被先射到。否则在往右边去就射不到了,要射到它有很多点可以采用,那么选择哪一个点更好呢?这里就用到贪心算法了,试想一下,往左边,还是右边射,射的会更多。毫无疑问是右边,因为我们是按升序排列的,本身选择的就是最小的,在往左边就更小,要想包含更多的气球,必须要在最右端射,射到这个气球的同时要额外射到更多别的气球。这样就实现了贪心。然而能射到的点是有限的,所以当它遇到射不到的点时,就需要用另一支箭了。

/**
 * @param {number[][]} points
 * @return {number}
 */
var findMinArrowShots = function(points) {

    if(points.length==0){
        return 0;
    }
    let pp=points.sort((a,b)=>a[1]-b[1]);//按右端排序

    let st_pos=pp[0][1];//选择第一支箭的位置
    let end=1;
    for(let i=1;i<pp.length;i++){
        if(pp[i][0]>st_pos){//该位置的箭无法射到该气球
            st_pos=pp[i][1];//更新新箭的位置
            end++;//添加箭
        }
    }

    return end;

};

二,Es6 Generator函数与Thunk的异步运用

学习文档
Generator是解决异步编程的方案
JavaScript 语言是传值调用,它的 Thunk 函数含义有所不同。在 JavaScript 语言中,Thunk 函数替换的不是表达式,而是多参数函数,将其替换成一个只接受回调函数作为参数的单参数函数。
任何函数,只要参数有回调函数,就能写成 Thunk 函数的形式。
前面为参数args,后一个为回调函数callback。

function thunkify(fn) {//thunkify源码
  return function() {//返回构造函数

    var args = new Array(arguments.length);
    var ctx = this;

    for (var i = 0; i < args.length; ++i) {
      args[i] = arguments[i];//复制参数
    }

    return function (done) {//传入回调函数
      var called;

      args.push(function () {//将回调函数加入到参数里面去
        if (called) return;
        called = true;//确保只执行了一次
        done.apply(null, arguments);//这里的arguments是回调出来的参数
      });

      try {
        fn.apply(ctx, args);//执行函数
      } catch (err) {//捕捉错误
        done(err);
      }
    }
  }
};

上面的代码可以构造一个thunk函数
异步解决方案

  1. 只用thunk函数执行的异步
function sleep(val,fun){//异步函数,前面为参数,后面为回调函数
	window.setTimeout(()=>{
		console.log("--------"+val);
		fun("dataaaaaaaaa");
	},1000);
}

let sthunk=thunkify(sleep);

let ss=sthunk('1111')((data)=>{//只用thunk函数执行的异步

	console.log(data);
	sthunk('2222')((data)=>{
		console.log(data);
	})

});
  1. 使用generator流程控制
let gen=function* (){

	yield sthunk('da11111');

	yield sthunk('da22222');
}

let g=gen();

let r=g.next();

r.value((data)=>{//使用generator流程控制
	console.log(data);
	let g1=g.next();
	g1.value((data)=>{
		console.log(data);
	})
})
  1. 配合使用
let gen0=function* (){//创建generator

	let da1=yield sthunk('da11111');
	console.log(da1);
	let da2= yield sthunk('da22222');
	console.log(da2);
}

function run(fn) {//自动运行函数
  let gen = fn();

  function next(data) {
    let result = gen.next(data);
    if (result.done) return;
    result.value(next);
  }

  next();
}

run(gen0);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值