设计模式-备忘录模式
一个主角,他可以创建一个当前自己的状态备份,也可以恢复到一个以前的状态。
备忘录管理员,传入一个备忘录,负责记录和取出状态。
备忘录,存储提供状态。
场景:
撤销
数据库事务回滚
设计模式-观察者模式
定义一个被观察者类,里面有个数组成员,用于存储观察者。有增加、删除、通知所有观察者的成员方法。定义谁能观察,谁不能观察。被观察者执行动作的时候,调用观察者的 update 方法,从而通知到所有观察者。
定义一个观察者接口,update 方法。
设计模式-门面模式
提供一个访问子系统的接口,除此之外不允许任何访问子系统的行为。
将子系统的各种方法封装成高阶方法,暴露给外面。只是一种简单封装,简化外部调用。
计算机科学
高等代数
离散数学
概率论与数理统计
数据结构与算法
计算机组成原理
操作系统
编译原理
计算机网络
关系型数据库理论
汇编
C++
Java
JavaScript
设计模式
MySQL
Redis
MQ
设计模式-UML
依赖
泛化(集成)
实现
聚合
组合
参考
UML
JS 根据条件动态添加对象属性
123const a = { ...(someCondition && { b: 5 }),};
每日打卡-LeetCode-421-数组中两个数的最大异或值
数组中两个数的最大异或值
这道题使用 Trie 前缀树存储数组中每个数。遍历数组中的数,从高位遍历一个数的每一位,将其存入 Trie 树。遍历每个数时,在 Trie 里面查询与它异或最大的数,方法是:遍历这个数的每一位,在 Trie 里面尽量选择与这一位相反的路径,到达叶节点时,这个路径代表的数就是与当前这个数异或最大的数。
1234567891011121314151617181920212223242526272829303132333435363738class Solution { public: // 用二维 vector 模拟 Trie 树 vector<vector<int>> s; // s[当前节点编号][当前节点第几个孩子] = 孩子节点编号,「当前节点第几个孩子」里面蕴含了信息,本题有两个孩子,0 和 1 代表这一位是 0 还是 1 void insert(int x) { int p = 0; for (int i = 30; i >= 0; i--) { // 取出当前位 ...
为什么 JS 不适合开发大型后端项目
js 里 99% 的错误全是 cannot read property ‘xxx’ of undefined。要是遇到了,就对照堆栈调试玩去吧。
代码内部,自己能把自己玩坏。没有类型系统,对象全是哈希,错误永远出在运行时,类型不安全。只要团队有一个打破窗户的人,代码质量会急剧下降。
typescript 编译大型项目速度缓慢。你能体会写代码十分钟,构建、调试 bug 一小时的开发体验吗?
js 是异步模型引擎,然而 90% 的业务代码都是同步。
js 开发者的 OOP 思想非常差。我很少在 js 代码中看到 OOP 思想,相反游离的变量,散乱的方法很多。
既然要开发 web 为什么不用 java 或者 go 专门为此而生的语言?很多问题可以在编译阶段发现。
js 代码内部是零信任的,由于没有类型系统,需要写很多防御代码验证类型,永远不要相信从函数外面传进来的是什么东西。
门槛太低,低端过剩,涌入大量水平很差的低端程序员,你想和他们共事吗?
每日打卡-LeetCode-740-删除并获得点数
原题链接
这道题也是有限制的选择问题,可以使用动态规划解决。
f(i,0)f(i,0)f(i,0) 表示只考虑 1 ~ i 这些数,不选 i 的选法中获得点数的最大值。由于不选 i,那么可以将问题划分成考虑前 i-1 个数,选 i-1、不选 i-1,所以 f(i,0)=max{f(i−1,1),f(i−1,0)}f(i,0)=max\{f(i-1,1),f(i-1,0)\}f(i,0)=max{f(i−1,1),f(i−1,0)}
f(i,1)f(i,1)f(i,1) 表示只考虑 1 ~ i 这些数,选 i 的选法中获得点数的最大值。由于选 i,那么不能选 i-1,所以 f(i,1)=f(i−1,0)+i∗cif(i,1)=f(i-1,0)+i*c_if(i,1)=f(i−1,0)+i∗ci。cic_ici 表示数组中有几个 i 这个数。
123456789101112131415161718const int N = 10010;int cnt[N], f[N][2];class Solution { public: int deleteAndEarn(vector& ...
每日打卡-LeetCode-1473-粉刷房子3
本题是一个三维 DP。
f[i][j][k] 表示染完前 i 个房子时有 j 个街区(只从前 i 个房子考虑),且第 i 个房子的颜色是 k 的所有方案。存储的值是代价最小值。
按第 i-1 个房子的颜色划分集合。
当第 i-1 个房子的颜色是 u 时:
如果 u = k,那么第 i-1 个房子和第 i 个房子是一个街区,f[i][j][k] = f[i-1][j][u] + cost[i][k],u 取 1, 2, 3, …, n。
如果 u ≠ k,那么第 i-1 个房子和第 i 个房子是不同的街区,f[i][j][k] = f[i-1][j-1][u] + cost[i][k],u 取 1, 2, 3, …, n。
123456789101112131415161718192021222324252627282930313233343536373839404142class Solution { public: int minCost(vector<int>& hs, vector<vector<int>>& cos ...