Algorithm 一道算法题
俩数之和,详见:https://leetcode.cn/problems/add-two-numbers/submissions/
// 链表
class ListNode {
val: number;
next: ListNode | null;
constructor(val: number, next: ListNode | null){
this.val = val;
this.next = next
}
}
function addTwoNumber(l1: ListNode| null, l2: ListNode | null){
const dummyHead = new ListNode(0); // 哨兵节点
let current = dummyHeadl;
let carry = 0; // 进位数
while(l1 !== null || l2 !== null || carry !==0) {
const val1 = l1.val || 0
const val2 = l2.val || 0
const total = val1 + val2 + carry
carry = Math.floor(total/10)
current.next= new ListNode(total%10)
current = current.next
if(l1 !==null){
l1 = l1.next
}
if(l2 !== null){
l2 = l2.next
}
}
return dummyHead.next
}
// test
const l1 = new ListNode(2, new List(5,new ListNode(8))) // 生成链表
const l2 = new ListNode(4, new List(7,new ListNode(9)))
let result = addTwoNumber(l1,l2)
while(result !== null) {
console.log(result.val)
result = result.next
}
复制代码
Review 读一篇英文文章
The Key To Accelerating Your Coding Skills
详见:http://blog.thefirehoseproject.com/posts/learn-to-code-and-be-self-reliant/
当学习编程时,存在一个转折点,它标志着一切开始改变。这被称为编程的拐点。通过此阶段后,作为开发人员的运作方式将发生根本性的变化。从新手到自给自足的过程可能会令人沮丧,但一旦克服,将变得非常有力量。
在开始学习编程时,你需要掌握特定任务,培养注意细节的能力很重要。逐步地,你将开始识别模式,原本令人困惑和陌生的事物会变得熟悉。阶段性的学习过程中,掌握注意细节的能力非常重要,尤其在处理错误消息和问题时。
在学习阶段,你将遵循指导,但随着时间的推移,你会逐渐掌握解决错误和注意小细节的能力,从而能够更快地取得进展。当你完成教程阶段时,你会注意到自己能够以更快的速度编写代码。
进入拐点阶段后,你将逐渐脱离使用教程,开始解决没有预先解决方案的问题。虽然在这个阶段你可能会感到困惑和不安,但实际上,你在学习最重要的事情。此时,你将培养出自学未知知识的能力。
值得注意的是,编程是一个终身学习的过程,而不是达到知识全面掌握的终点。在完成拐点后,你将会在处理错误消息、查找解决方案以及使用已有代码方面变得更加自信。
在拐点过程中,最终阶段是接受。你要接受编程是持续学习的过程,不断解决更复杂的问题。通过经验获得的自信是关键,编程将始终是一个不断学习的过程。
总的来说,掌握拐点后,你将能够自信地解决问题,具备在编程和开发领域取得长远成功的基础。
Technique/Tips 分享一个小技术
前端开发常见的设计模式- 代理
什么是设计模式:研究类本身或者类与类之间的协作模式,是进行抽象归纳的一个很好的速成思路。
代理(Proxy):理解保护
代理是为了包装一个类,对相关操作进行二次转发或者进行一些管控。工作中来说,有些工作模式下,有时候我们可能会抱怨管理者代理了我们的决策等操作,但是换个角度想,他们保护了你不用直接被暴露在业务方侧,能够按照预期内的节奏提供服务,不会被主动设置一些预期外操作或私活。
(Reference:https://mp.weixin.qq.com/s/kc7tgGLiPUrmq67da9Uhow)
前端框架 vue 的响应式,就用到了代理模式。
通过 Object.define、Proxy 自动的完成依赖收集,相应数据变化。get 方法中收集依赖,set 方法中,get 方法中联动处理。
const data = {
a: 123,
b: 456
}
let activeEffect
const effectStack = [];
function effect(fn) {
const effectFn = () => {
cleanup(effectFn)
activeEffect = effectFn
effectStack.push(effectFn);
fn()
effectStack.pop();
activeEffect = effectStack[effectStack.length - 1];
}
effectFn.deps = []
effectFn()
}
function cleanup(effectFn) {
for (let i = 0; i < effectFn.deps.length; i++) {
const deps = effectFn.deps[i]
deps.delete(effectFn)
}
effectFn.deps.length = 0
}
const reactiveMap = new WeakMap()
const obj = new Proxy(data, {
get(targetObj, key) {
let depsMap = reactiveMap.get(targetObj)
if (!depsMap) {
reactiveMap.set(targetObj, (depsMap = new Map()))
}
let deps = depsMap.get(key)
if (!deps) {
depsMap.set(key, (deps = new Set()))
}
deps.add(activeEffect)
activeEffect.deps.push(deps);
return targetObj[key]
},
set(targetObj, key, newVal) {
targetObj[key] = newVal
const depsMap = reactiveMap.get(targetObj)
if (!depsMap) return
const effects = depsMap.get(key)
// effects && effects.forEach(fn => fn())
const effectsToRun = new Set(effects);
effectsToRun.forEach(effectFn => effectFn());
}
})
复制代码
Share 分享一个观点
只有技术才是硬通货。
详见:https://coolshell.cn/articles/10688.html
很长一段时间内,觉得可能到了 30 岁就找不到工作了。有这种想法的原因有,不够自信,我是种半路转行,又是二流大学。最主要的原因是懒惰,逃避。
入行这六年来,一直苦苦做业务,似乎觉得多做点业务,才对得起自己的那份工资。对于数据结构,后端知识一直疏于学习。直到认识耗子叔,我似乎找到了学习的灯塔。开始学习数据结构,后端知识,坚持学英语。学习的路上真的很枯燥,但成就感也满满。例如能用 docker 部署服务,会用 nest.js 处理一些后端的逻辑。分布式、单体应用、redis 等这些词不陌生的时候,似乎有了更多的自信。前几天参加华为机考的时候,会做俩道算法题。虽然机考还是被刷了,但是对我自己而言,是进步。放在一年前,我连参加的勇气都没有的。
只有技术才是硬通货,精练自己的手艺。
I know I'm not a smart guy, but I would keep it up.
评论