滑动窗口解法总结
应用场景
满足什么条件(无重复,无覆盖等)的最长/最短的子串/子数组/子序列 (连续)
思路
寻找最长
- 核心:左右双指针在起始点,右指针向右逐位滑动。在滑动的过程中
- 窗内元素满足条件,右指针向右扩大窗口,并更新最优结果
- 窗内元素不满足条件,左指针向右缩小窗口
- 直到右指针到达结尾
模板
// 初始化 left,right,result,bestResultwhile(right没有到结尾){窗口扩大,加入right对应元素,更新当前的结果while(当前结果不满足要求){窗口缩小,移除left对应元素,left++;}更新最优结果right++;}return bestResult;
寻找最短
核心:左右双指针在起始点,右指针向右逐位滑动。在滑动的过程中
- 窗内元素满足条件,左指针向右缩小窗口,并更新最优结果
- 窗内元素不满足条件,右指针向右扩大窗口
- 知道右指针到达结果
- 模板
// 初始化 left,right,result,bestResultwhile(right没有到结尾){窗口扩大,加入right对应元素,更新当前的结果while(当前结果满足要求){更新最优结果窗口缩小,移除left对应元素,left++;}right++;}return bestResult;
滑动窗口算法
209. 长度最小的子数组
904. 水果成篮
76. 最小覆盖子串

类数组转数组
function Person(){// 1const arr1 = [];for(let i = 0; i < arguments.length; i++){arr1.push(arguments[i]);}console.log(arr1)// 2let arr2 = Array.from(arguments);console.log(arr2)// 3let arr3 = Array.prototype.slice.call(arguments)let arr4 = [].slice.call(arguments);console.log(arr3)console.log(arr4)// 4let arr5 = [...arguments];console.log(arr5)}Person('1', '2', '3', '4')/**[ '1', '2', '3', '4' ][ '1', '2', '3', '4' ][ '1', '2', '3', '4' ][ '1', '2', '3', '4' ][ '1', '2', '3', '4' ]*/
promise执行
第一题
Promise.reject('err!!!').then((res) => {console.log('success', res)}, (err) => {console.log('error', err)}).catch(err => {console.log('catch', err)})// 'error', err!!!!// then 和 catch 的优先级由顺序决定


但catch执行之后 then还是继续执行
第二题
Promise.resolve().then(function success (res) {throw new Error('error!!!')}, function fail1 (err) {console.log('fail1', err)}).catch(function fail2 (err) {console.log('fail2', err)})// fail2', error!!!!
第三题
Promise.resolve('1').then(res => {console.log(res)}).finally(() => {console.log('finally')})Promise.resolve('2').finally(() => {console.log('finally2')return '我是finally2返回的值'}).then(res => {console.log('finally2后面的then函数', res)})
