outdoors 从0到1
HTML5 + CSS3 + SCSS(布局 position + float + media)的学习与 outdoors 从0到1专案练习。
react-jira-app 从0-1(停滞状态)
从0到1做一个事务与项目跟踪软件
二分搜索题&解
参阅基础
enpei-二分搜索简介
我写了首诗,把二分搜索算法变成了默写题
简介二分搜索通常用于在有序的区间内寻找某个目标。如果区间内存在多个目标,还可以区分为寻找左侧边界的二分搜索和寻找右侧边界的二分搜索。
最基本的二分搜索算法:
123456因为我们初始化 right = nums.length - 1所以决定了我们的「搜索区间」是 [left, right]所以决定了 while (left <= right)同时也决定了 left = mid + 1 和 right = mid - 1因为我们只需找到一个 target 的索引即可所以当 nums[mid] == target 时可以立即返回
寻找左侧边界的二分搜索:
1234567因为我们初始化 right = nums.length -1所以决定了我们的「搜索区间」是 [left, right]所以决定了 while (left <= right)同时也决定了 left = mid + 1 和 right = mid - 1因为我们需找到 target 的最左侧索引所以当 nums[mid] == targe ...
滑动窗口题&解
参阅基础
enpei-滑动窗口简介
我写了首诗,把滑动窗口算法算法变成了默写题
简介遇到与给定对象的连续子区间有关的问题时,一个很容易联想到的技巧就是滑动窗口。
滑窗的思路非常简单,就是维护一个窗口,不断滑动,然后更新答案。
但滑窗的难点不是算法的思路,而是各种细节问题。比如如何向窗口中添加新元素,如何缩小窗口,在窗口滑动的哪个阶段更新结果。
以下这套滑动窗口算法的代码框架,标记了实现中需要注意的细节,和输出 debug 的位置。以后遇到相关的问题,只需要默写出该框架,然后改三个地方就行:
12345678910111213141516171819202122232425262728const slidingWindow = (s) => { const win = []; let left = 0, right = 0; while (right < s.length) { // c 是将移入窗口的字符 const c = s[right]; // 增大窗口 ri ...
4分钟讲我4个月的学习过程
先简单描述一下我自己的生活状态吧,有在慢慢调整改进。
早八晚十二(赖床的话一般就 9 点起床)
早饭中饭晚饭一直不是很规律
学习
家务与琐事
一天的娱乐很少,如果不是给妹妹拉去看动漫的话基本没有。刷剧看动漫对我诱惑力蛮大的,所以我尽量少接触,不然今天的学习就基本结束了。这点要改進。
自己的一般娱乐多在于看一些在学习或其他领域的经历与经验。看着别人讲述自己的经历还是很有意思的,会有值得学习的地方。
形式 -> 效率各项划分形式:番茄钟学习法 + 知识点梳理并记录 blog + 日报复盘 + 微信群打卡监督
迭代过程:微软 todo + 微信群打卡监督 -> 飞书日报(个人工作日报 简洁版)+ 微信群打卡监督 -> 飞书日报(看板视图)+ 微信群打卡监督 -> 番茄 todo + 简单日报 + 微信群打卡监督 -> 番茄钟学习法 + 知识点梳理并记录 blog + 简单日报 + 微信群打卡监督 (过程历时半年)
学习周期:一周六天,放假一天
迭代过程:一周七天无休,有时间就学,累了就放松 -> 一周六天,放假一天,偶尔调休
学习时长:5-6 ...
0706-0829(暑假) 复盘
假期感慨这个暑假可以用以下的词描述:
焦虑、焦躁
规划,复盘
做好小事
坚持
记录 blog
减少信息差
停下来想想
放弃 放松
以上这些词在我这个假期是常常伴随在我的身边,周而复始。可以说是我的学习状态吧!
焦虑、焦躁我的状态:”焦虑、焦躁“ 对我来说有时是奋起直追,有时确实好想摆烂。具体还是看我当时怎么认识,能正面的认识然后选择把自己手上的牌打好,还是远远的躲着它呢?有时能做好有时却做不好。现在回想起来也是一个过程。
分析它:其实这两词我目前能意识到最大的原因是 “想要的太多,而做到的却很少” 、 “想要的太多,很多事情得坚持很久才能有回报”,一个词来说就是有点 “急功近利”。
应对方案:让它静下来,别让他太蹦跶。马上开始 看书 / 学习 / 睡觉 / 鸡汤 / 看星球。
规划、复盘我的状态:我可喜欢它们了,可以在这个期间放松自己的脑子,我学习周期是一周 6 天,然后放假一天,没事的时候我就开始规划复盘,看看自己未来一小段时间(半个月)要做啥,做的这些事我能不能按时按量的做完啊。
分析:规划就象导航一样,而复盘呢像是”回味沿途风景” 可能 ...
双指针技巧-数组题&解
参阅基础
双指针技巧秒杀七道数组题目
相关习题LeetCode 26.删除有序数组中的重复项题目来源:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/难度:简单
我的题解思路:运用快慢指针技巧。设置fast引为1,slow索引为0,快指针在前面探路,找到一个不重复的就赋值给slow并让其前进一步去准备接受下一个不重复的值。
123456789101112131415161718/** * @param {number[]} nums * @return {number} */var removeDuplicates = function(nums) { let fast = 1; let slow = 0; while(fast < nums.length){ if(nums[fast] != nums[slow]){ slow++; nums[slow ...
双指针技巧-链表题&解
参阅基础
双指针技巧秒杀七道链表题目
enpei-双指针简介
简介双指针,指的是在遍历对象的过程中,不使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。
换言之,双指针法充分使用了数组(或链表)有序这一特征,从而在某些情况下能够简化一些运算。
对于单链来说,大部份技巧都属于快慢指针。
此外,链表算法题还有个很常见的「虚拟头结点」技巧。就是在实际的链表头前放一个 dummy 节点,作为占位符,可以避免处理空指针的情况,降低代码的复杂性。
相关习题LeedCode 21.合并两个有序链表题目将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
来源:https://leetcode.cn/problems/merge-two-sorted-lists/
示例 1:
12输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]
示例 2:
12输入:l1 = [], l2 = []输出:[]
示例 3:
12输入:l1 = [], l2 = ...
LinkedList 实现
参阅基础
学习 JavaScript 数据结构与算法(第六章-链表)
定义链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。
LinkedList 类第一步:创建 LinkedList.js
职责:
push(element):向链表尾部添加一个新元素。
removeAt(position): 从链表的特定位置移出一个元素。
insert(element,postion): 向链表的特定位置插入一个新元素。
size(): 返回链表包含的元素个数。
isEmpty(): 如果链表中不包含任何元素,返回 true,如果链表长度大于 0 则返回 false。
getElementAt(index): 返回链表中特定位置的元素。如果链表中不存在这样的元素,则返回 undefined。
indexOf(element): 返回元素在链表中的索引。如果链表中没有该元素则返回-1。
remove(element): 从链表中删除一个元素。
toString(): 返回表示整个链表的字符 ...
差分数组题&解
参阅基础
enpei-差分数组简介
小而美的算法技巧:差分数组
labuladong差分数组精讲-13min后
简介适用场景:频繁对原始数组的某个区间的元素进行增减。
差分数组抽象类1234567891011121314151617181920212223242526272829class Difference { constructor(nums) { this.diff = new Array(nums.length).fill(0); this.diff[0] = nums[0]; for (let i = 1; i <= nums.length - 1; i++) { this.diff[i] = nums[i] - nums[i - 1]; } } // 让用户去执行区间加减操作 increment(i, j, val) { this.diff[i] += val; if (this.d ...