250928-251005 weekly electron
尝试使用electron将React生成的静态网页打包成桌面应用。 0. 项目结构静态网页资源dist应先移动到application项目中。 1234567891011121314.├── application│ ├── package.json│ └── main.js├── dist| └── index.html└── web ├── package.json ├── vite.config.js ├── src ├── App.jsx └── components └── Navigation.jsx 1. 项目初始化与安装参考:教程 但是在安装时出现问题,是网络的原因。运行以下命令后安装,解决: 1npm config set registry https://registry.npmmirror.com; $env:ELECTRON_MIRROR =...
251003 thinking factory method& abstract factory
1. 工厂方法以点菜为例。 1234567type dish interface{ Cook() }type pizza struct{}type burger struct{}func (*pizza) Cook() { }func (*burger) Cook() { } 若不用工厂方法,则客户端直连产品,新增产品要改分支,不符合开闭原则。 1234567891011121314func orderDish(typeName string) dish { switch typeName { case "pizza": d := &pizza{} d.Cook() // "cook pizza" return d case "burger": d :=...
250926 thinking 翻转链表
1. 操作以这道题为实例。 对链表的某一部分进行翻转时,需要记录以下这几个节点: p0: 发生翻转区域的前置节点,这个是为了区域翻转后的连接(循环结束,p0.next为翻转后区间的最后一个元素)。为了统一处理(因为原链表有的翻转区域没有前置节点),先构造dummy=ListNode{next: head}。这样的话,翻转后的链表的头节点即为dummy.next。p0可能为dummy。 cur: 当前遍历到的节点,循环结束,cur为区域后的第一个元素 pre: 当前遍历到的节点的原链表中的上一个节点,在翻转后就是next。在最初翻转前为nullptr,循环结束,pre为翻转后的区域的第一个元素 nxt: 当前遍历到的节点的原链表中的下一个节点,下一个cur,在翻转后它的next就是pre。 操作如下: 123456789101112cur := p0.nextpre := nullptrfor cur in area; do nxt := cur.next cur.next = pre pre = cur cur = nxtend...
250926 thinking 0-1背包dp
本文的内容是0-1背包的空间优化、倒序遍历,以及至多/恰好/至少变体。一些基本概念不再赘述。 1. 空间优化由于它的递推表达式: $$dp[i][c] = \max{, dp[i-1][c],; dp[i-1][c-w[i]] + v[i] ,}$$ dp[i][c]: 遍历到第 i 个物品时,若总容量为 c 时能获得的最大价值 可以发现每次更新值时,都是 i-1 更新 i 的,所以完全可以写为: $$dp[c] = \max{, dp[c],; dp[c-w[i]] + v[i] ,}$$ 2. 倒序遍历在使用一维数组进行空间优化时,容量 c 必须“倒序遍历”(从最大容量 C 递减到 w[i])。 Why? 若正序遍历(c 从小到大),在同一轮 i 的更新中,dp[c-w[i]] 已经被本轮 i 更新过,会导致同一物品 i 被复用多次,等价成“完全背包”的效果; 倒序遍历能保证本轮计算依赖的是“上一轮 i-1 的结果”,从而保持 0-1 约束。 更形式化的解释:维护不变式“在处理物品 i 时,所有用于计算的 dp[*] 均来自...
250926 thinking 差分
1. 简介对于一个数组a,构造的这样的一个数组d称为a的差分数组: d[i] = \begin{cases} 0, & \text{if } i = 0 \\ a[i] - a[i-1], & \text{otherwise} \end{cases} 2. 性质 对d构造前缀和数组得到a 对于a的一个下标区间[i,j)对应的元素统一加上一个数c后,则对应的d的变化为:d[i](now)=>d[i](prev)+c d[j](now)=>d[j](prev)-c。 也就是说,差分数组的构造可以将一个区间的变化映射为两个元素的变化。 在实际操作时,还要注意j==a.length,此时超出d索引范围(因为在前面的构造中d.length==a.length)。因此为了方便,通常让d.length=a.length+1,即设置一个dummy。 3. 例题3355.零数组变换I go参考解法:(by 灵神) 1234567891011121314151617func isZeroArray(nums []int,...
250926 thinking 子序列判断
1. 介绍引例:有一个字符串t。现有若干字符集合$s_i$,需要判断对于每一个$s_i$,它的每一个元素是否在t中出现。 一种方式是,对于t中的所有字符建立一个map。然后对于一个$s_i$中的每一个元素c,若map[c]都判断为存在,则$s_i$的每一个元素都在t中出现,否则不是。 现在将问题换为“有一个字符串t。现有一个字符串集合$s$,需要判断对于每一个元素$e_i$,它是否是t的子序列。” 这个时候,不仅仅要考虑字符的存在与否了,还要考虑字符之间的相对位置关系。 比方说,t=aaabbb,e=ba。判断e是否是t的子序列时,我们还要判断在t的b后面的元素中是否还有a。 我们使用的map得能够“屏蔽”在t的某个元素前面的所有元素的存在性。 于是使用nxt,nxt[i][c]: t中下标不小于i的元素中出现c的最小下标。 2. 解释将nxt[t.length][c]初始化一个很大的值BIG,作为判断存在依据。 其他nxt[i][c]构建: 1234for i in t.length-1 to 0; do copy nxt[i+1] to nxt[i] ...
250926 thinking 反悔堆
反悔是贪心的一种策略,用于在当前可能不是全局最优解时,“反思”已做过的选择。 而对于这样的策略,常使用堆来辅助实现。具体来说就是将已做的选择按照某种规则放入最大堆中。“反悔”就是“撤销”堆顶的选择,即代价最大的选择。 用最大堆在约束触发时“撤销/替换”当前集合里最差的那个已选项。 1. 示例LCP30. 魔塔游戏 123456789101112131415161718magicTower(nums[0..n-1], hp){ declare a empty max heap, named heap. ans := 0 for num in nums; do if num < 0; then heap.push(num) // push the negative number into the heap, so that we can recover the choice later if needed fi hp += num if hp <= 0;...
250926 tool docker install&command
1. 国内ubuntu服务器安装docker(使用aliyun镜像源,root用户)1.1. 安装123456apt updateapt install -y apt-transport-https ca-certificates curl gnupg lsb-releasecurl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | apt-key add - # 可能需要先安装curladd-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # 可能需要先apt install software-properties-commonapt updateapt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin...
250824 thinking quicksort
快速排序是一种平均时间复杂度$O(n\log n)$平均空间复杂度$O(\log n)$的优秀的排序算法。其基本原理是每次维护两个区间里的元素然后不断递归。基本思想与流程是简单明晰的,常见的是左右指针向中间靠拢的方式。但这种方式有很多细节需要注意,例如是左指针先动还是右指针先动、指针移动条件等。稍有不慎,就可能甚至导致死循环。 于是参考《算法导论》给出的更易于理解的做法。 1. 伪代码示例这里是从小到大的顺序排序。 123456789101112131415161718192021222324252627282930// input: A[lo...hi-1], lo, hi// A[lo...hi-1]: array to be sorted// lo, hi: the region to be sorted is [lo, hi)// output: sorted arrQuickSort(A[lo...hi-1], lo, hi): if lo + 1 >= hi; then return // in this case, no element/...
250824 thinking Trie
字典树(Trie)是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。每个节点有26个子节点,子节点的序号分别代表26个字母。因此,从根节点到某个节点的路径表示一个字符串。有时候,每个节点会有一个标记,用于表示是否为一个字符串的结束。如果一个节点的标记为true,那么从根节点到该节点的路径表示的字符串就是一个单词。 C++示例以下是一个简单的C++实现,支持插入、搜索和前缀搜索。 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748class Node {public: int end; vector<unique_ptr<Node>> son; Node():end(0),son(26){};};class Trie {public: unique_ptr<Node> root; Trie() { ...