LeetCode(1)两数之和
今天是小呆刷题的第5天,今天的题目是:力扣(LeetCode)的第1题,两数之和
题目要求
给定一个整数数组nums和一个整数目标值target,请你在该数组中找出和为目标值target的那两个整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例:
123输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
提示:
2 <= nums.length <= 10^4
-10^9 <= nums[i] <= 10^9
-10^9 <= target <= 10^9
只会存在一个有效答案
解题思路大名鼎鼎的LeetCode第一题,通过率只有52.9%,小呆第一次做这道题也没做出来。思路其实蛮简单的,维护一个HasMap,一般情况下我们存储数据都是index -> value,因为这道题要求返回下标,所以这个HasMap维护的是value ...
JavaScript 关于作用域的理解
如果你对作用域、作用域链、词法作用域等概念还傻傻分不清楚,那就看看这篇文章吧。了解作用域相关知识,也有助于理解闭包、执行上下文等JS核心知识。跟随小呆的视角,一起来复习一下吧。
知识点
理解JavaScript的执行过程
理解什么是作用域 & 作用域链
理解什么是词法作用域
理解JavaScript的执行过程在说作用域之前,我们要知道JavaScript的执行过程是分为两个阶段的:代码的编译阶段和代码的执行阶段。编译阶段由编译器完成,将代码翻译成可执行代码,这个阶段作用域规则会确定。执行阶段由引擎完成,主要任务是执行可执行代码,执行上下文在这个阶段创建。
作用域和执行上下文是完全不同的两个概念。一个在代码的编译阶段发生,一个在代码的执行阶段发生。
编译阶段词法分析编译器首先会将由字符组成的字符串分解成有意义的代码块,这些代码块被称为词法单元(token)。
1var a = 2;
以上面的代码为例,通常会被分解成词法单元:如 var, a, =, 2, ;,这些词法单元组成了一个词法单元流数组。
12345678910111213141516171819202122[ ...
LeetCode(283)移动零
今天是小呆刷题的第4天,今天的题目是:力扣(LeetCode)的第283题,移动零
题目要求
给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。
请注意,必须在不复制数组的情况下原地对数组进行操作。
示例:
12输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]
提示:
1 <= nums.length <= 10^4
-2^31 <= nums[i] <= 2^31 - 1
解题思路刷题的第4天,遇到这种原地操作数组的题,看起来要求跟第27题移除元素很相似,唯一的区别是把数组里所有的0移到末尾。小呆首先的思路是考虑用双指针算法,所以第一步是先将非0的元素移到前面。以示例代码为例:
1234567891011121314151617/** * @param {number[0, 1, 0, 3, 12]} nums * @return {void} Do not return anything, modify nums in-place inst ...
LeetCode(27)移除元素
今天是小呆刷题的第3天,今天的题目是:力扣(LeetCode)的第27题,移除元素
题目要求
给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
示例:
123输入:nums = [0,1,2,2,3,0,4,2], val = 2输出:5, nums = [0,1,4,0,3]解释:函数应该返回新的长度5, 并且nums中的前五个元素均为0,1,3,0,4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为5 ,而 nums = [0,1,3,0,4,2,2,2] 或 nums = [0,1,3,0,4,0,0,0],也会被视作正确答案。
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 50
0 <= val <= 100
解题思路因为需要原地修改数组,并且无需考虑元素的 ...
LeetCode(83)删除排序链表中的重复元素
今天是小呆刷题的第2天,今天的题目是:力扣(LeetCode)的第83题,删除排序链表中的重复元素
题目要求
给定一个已排序的链表的头head,删除所有重复的元素,使每个元素只出现一次。返回已排序的链表。
示例:
12输入:head = [1,1,2,3,3]输出:[1,2,3]
提示:
链表中节点数目在范围[0, 300]内
-100 <= Node.val <= 100
题目数据保证链表已经按升序排列
解题思路由于链表已经按升序排列,所以值相同的两个节点肯定相连。这道题的本质其实与昨天的题一样,只不过数据结构由数组变成了链表。我们依然可以使用双指针算法来解决。
依旧用一张git图来帮助理解代码在循环过程中,及最后的slow.next = null的作用。
123456789101112131415161718192021222324/** * Definition for singly-linked list. * function ListNode(val, next) { * this.val = (val===undefined ...
LeetCode(26)删除有序数组中的重复项
如果说面试中小呆最怕什么,那一定是算法。在以往的业务开发中,遇到需要算法的地方屈指可数。加上大学期间并没有系统的学过数据结构与算法,导致算法成为了小呆的一个非常明显的短板。曾经有一段时间突击过数据结构与算法的学习,遗憾的是并没有坚持下来。从今天开始,重新开启每日一题,旨在弥补短板,成为更好的自己。
今天是小呆刷题的第1天,今天的题目是:力扣(LeetCode)的第26题,删除有序数组中的重复项
题目要求
给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。
由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有k个元素,那么nums的前k个元素应该保存最终结果。
将最终结果插入nums的前k个位置后返回k。
不要使用额外的空间,你必须在 原地修改输入数组并在使用O(1)额外空间的条件下完成。
示例:
123输入:nums = [1,1,2]输出:2, nums = [1,2,_]解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个 ...
手写一个带取消功能的延迟函数
最近在看一些优秀文章的时候,关注到了若川,他组织了一个若川视野X源码共读的活动,每周一起学习200行源码,我觉得这是一个非常不错的机会,不管是对于前端新人,还是工作多年的老手,都能够有一个提升。自然而然我也加入到这个活动里面,这是加入此活动的第一篇笔记。
关于手写一个带取消功能的延迟函数,我在两年前的一次面试中遇到过,这算是一个由浅入深的系列问题,从简单的延迟,到随机延迟,再到取消功能和最后的取消请求。当时没能答的很好,这次刚好源码共读第18期就是一个delay函数的实现,借此机会也复习一下相关知识。
知识点
实现一个完整的延迟函数
AbortController如何使用
了解Axios取消请求
实现一个完整的延迟函数我们来模拟一场面试,来学习如何实现一个完整的延迟函数。前提:面试询问了我一些关于Promise的知识。接着面试官说:小呆你好,我想实现一个闹钟,希望可以在任意时间后打印出“起床啦”,但是我希望你能用Promise实现。我心想,这还不容易,您瞧好嘞!
基本功能12345// 面试官想要的效果(async () => { await delay(1 ...
JavaScript this到底指向谁
相信很多前端同学在曾经的面试过程中,都经历过this指向的灵魂拷问。对于基础知识掌握不扎实的同学,this指向似乎是一门玄学,有人说this的绑定是在代码创建阶段完成的,有人说this的绑定是在代码执行阶段完成的,那真相到底是什么,跟着我一起复习一下吧。
知识点
this的绑定是在什么阶段完成的
this的绑定规则
this绑定的优先级
特殊环境的this指向
this的绑定是在什么阶段完成的如果你了解JavaScript执行上下文(对JS执行上下文不了解的同学推荐先看我的另一篇文章《理解执行上下文》),那么你一定能脱口而出:this的绑定是在执行阶段完成。我们先来回顾一下不同的执行上下文是如何被创建出来的:
JavaScript引擎先创建全局执行上下文(this在此阶段被绑定到GlobalObject)
全局执行上下文入栈
代码开始执行,遇到函数调用,创建函数执行上下文(this在此阶段根据上下文动态绑定)
执行函数内部代码,执行完毕,函数执行上下文出栈
我们都知道全局执行上下文的this指向的是window对象(浏览器下)。那函数的执行上下文,this绑定的依据是什么?答 ...
一起露营吧
“春来也无信,春去也无踪,眼睛一眨,在北平市内,春光就会同飞马似的溜过”,郁达夫曾这样幽默的描述过北京的春天。是的,北京的春天总是很短,刚脱掉羽绒服,似乎还没细细的感受春天到来,说不定就得穿上短袖,打上遮阳伞。正因为北京的春天短,所以才要抓住时机,去感受一下北京的春天。
三年的口罩,隔绝了我们与大自然的拥抱,解封后的第一个春天,是时候出去走走了。刚好小萌的小伙伴组织了一次自驾露营,借着这个机会,去好好感受一下春天的味道。
我们这次露营的地点选在了怀柔区的白河湾生态营地,从家里出发全程 95Km,单程在 2 个小时左右。似乎是周末+郊区的原因,路上的车不算多,路两边的小树苗也才刚刚抽枝。
进入怀柔区后,车渐渐的就多了起来。路两边开满了画,甚是好看。还有很多观景台,能近距离的观赏一些未经开发的长城。不过由于观景台人还挺多,我们也没有停留。
终于到达目的地了,小伙伴们也忙碌了起来,搭天幕,架烧烤架,零食水果满满一大桌。我先偷个懒拍几张美美的照片~
吃吃喝喝总是少不了的,户外烧烤肯定是必备的项目之一了。小伙伴们的手艺也是棒棒哒~
吃饱喝足,小伙伴们有的打牌(输了要表演节 ...
理解JavaScript执行上下文
众所周知,前端是一个低门槛,进阶难的一个岗位。而JavaScript又是前端中的重中之重,不管是出于面试还是提升自己,都得学习并掌握JavaScript程序如何在内部执行的。而理解执行上下文和执行栈对于理解其他JavaScript概念(如:提升、作用域和闭包)至关重要。
知识点
什么是执行栈
什么是执行上下文
执行上下文的发展阶段
如何创建执行上下文
什么是执行栈在学习执行上下文之前,我们先了解一些前置知识:
我们都知道汽车最重要的部分是:引擎(发动机)。JavaScript也是如此,**JavaScript引擎是运行JavaScript代码的发动机**。
而执行栈,就是JavaScript引擎用来管理执行上下文的数据结构。代码执行期间的所有执行上下文,都会被存储到执行栈中。栈的特点是后入先出,所以先入栈的执行上下文会在最后才出栈。
执行栈(也叫调用栈),具有LIFO(后入先出)结构,用于存储在代码执行期间创建的所有执行上下文
什么是执行上下文了解了什么是执行栈之后,接下来我们看一下什么是执行上下文:
JavaScript标准,把一段代码(包括函数)执行所需的所有信息定义为 ...