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 activeEffectconst 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.
评论