数组的经典问题,求连续子数组的最大和

188 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第28天,点击查看活动详情

目录

今日题

  1. 题目
  2. 分析 昨日题
  3. 题目
  4. 答案
  5. 解析 结语

今日题

题目

实现一个函数getMaxSubArr找出数组中连续子数组的最大和并返回

const arr = [1, 3, -2, 4, 7, -9, 6]
const res = getMaxSubArr(arr)
console.log(res)	//13

分析

  • 可以用一个变量firstValue来保存数组的第一个元素,先默认它是最大的
  • 在遍历数组时,用另一个变量maxSum保存当前遍历到的子数组的和
  • 然后比较maxSumfirstValue,得到最大值

昨日题

题目

实现一个类 名称:CallbackSavior 属性:自定义 方法:push,run

答案

class CallbackSavior {
	all = []
	upv = null

	push(cb) {
		this.all.push(cb)
	}

	async run() {

		while(this.all.length) {
			const cb = this.all.shift()
			if(cb?.constructor === Function) {
				this.upv = cb(this.upv) 
			} else if (cb?.constructor === Promise) {
				this.upv = await cb
			} else {
				this.upv = cb
			}
		}
			
		return this.upv
	}
}

解析

  • CallbackSavior中定义数组all和保存上一个传入push的回调的结果的upv
  • 在实例CallbackSavior后,将push接受的所有实参都推入all数组中
  • 由于cbs.run是一个async的异步函数,所以可以调用then方法
async run() {

	while(this.all.length) {

		const cb = this.all.shift()

		if(cb?.constructor === Function) {
			this.upv = cb(this.upv) 
		} else if (cb?.constructor === Promise) {
			this.upv = await cb
		} else {
			this.upv = cb
		}
	}
		
	return this.upv	//(*)
}
  • run中,我们以this.all.length为条件,第一次进入时,由于我们通过cbs.push添加了6个数据,所以其长度为6
  • 然后每次都shift弹出一个之前推入数组的数据,用cb接收
  • 之后对cb的类型进行判断
  • 如果cbFunction,就运行它,并将this.upv传入, 同时用this.upv来接收
  • 如果它是Promise,则await得到其结果,同样用this.upv来接收
  • 最后判断其为基础类型,则直接赋值给this.upv即可
  • (*)处的返回this.upv,是为了成功运行下面的代码
cbs.run().then(value => {
    console.log(value); // ddd
});
  • 将返回的this.upv当作实参传给value,最后成功运行

结语

此文章已收录至《JavaScript每日一题》专栏,如果你对本专栏有任何建议,欢迎反馈。如果你对此文章中的题目还有不懂的地方,那么请在评论区留言与大家一起讨论吧。
创作不易,少年,就请留个赞再走吧!