设计模式-工厂方法模式
网站链接:工厂方法设计模式 (refactoringguru.cn) 简介工厂方法模式 她是一种创建型设计模式,其在父类中提供一种船舰对象的方法,允许子类决定实例化对象的类型。 简单工厂‘简单工厂模式’,也就是说,到底要实例化谁,将来会不会增加实例化的对象,比如增加开根运算,这是很容易变化的地方,应该考虑用一个单独的类来做这个创造实例的过程,这就是工厂简单工厂就是在需要的时候, 创建对应的类. 每个类都相互独立,互不影响, 如果增加代码,不会编译之前的类, 减少编译时间. 工厂方法模式结构不同的类实现相同的动作,例如运输等 产品 (Product) 将会对接口进行声明。 对于所有由创建者及其子类构建的对象, 这些接口都是通用的。 具体产品 (Concrete Products) 是产品接口的不同实现。 创建者 (Creator) 类声明返回产品对象的工厂方法。 该方法的返回对象类型必须与产品接口相匹配。 你可以将工厂方法声明为抽象方法, 强制要求每个子类以不同方式实现该方法。 或者, 你也可以在基础工厂方法中返回默认产品类型。 ...
leetcode 2511 最多可以摧毁的敌人城堡数目
2511. 最多可以摧毁的敌人城堡数目 - 力扣(LeetCode) 思路抽象出来就是求1和-1间最大连续0 的数量。 有两种情况,开始是1 结尾是-1,中间都是0;第二种情况开始是-1结尾是1,中间都是0;上边怎么保证终点和起点不一样呢? 1.当然可以分类讨论,代码会很复杂,判断很多,容易出错 使用 一个变量pre记录开始节点,变更当1或者-1 进来的时候,pre 更新为index,判断当前节点是否和pre 不相等,符合条件则更新res 12345678910111213141516171819202122232425262728293031323334353637383940func captureForts(forts []int) int { ans, pre := 0, -1 //pre 记录的是 1 或 -1 的位置 for i, fort := range forts { if fort == -1 || fort == 1 { if pre >= 0...
LRU
146. LRU 缓存 - 力扣(LeetCode) list Elemet 双向列表; 123456789101112131415161718192021222324252627282930313233343536373839404142434445import "container/list"type LRUCache struct { cap int // 缓存容量 cache map[int]*list.Element//!!! 双向链表 使用Element // 双向链表节点 指向的map list *list.List // 双向链表}type keyVal struct { key, val int // 节点的Key和Value}func Constructor(capacity int) LRUCache { return LRUCache{ cap: capacity,...
leetcode 最大深度和最小深度
题目104. 二叉树的最大深度 - 力扣(LeetCode) 111. 二叉树的最小深度 - 力扣(LeetCode) 思路深度 是指从根节点到该节点的距离(节点数量)高度 是指从该节点到叶子节点的角力(节点数量) 最大深度 可以通过迭代法,计算总共有多少层。 可以使用递归分治的思想,1 + maxDepth(左子树) + maxDepth(右子树)最小子树 其实和最大深度类似,但是这里要注意的是,不能直接套用最大深度的代码。最小子树的要求是,到叶子节点的距离。而上边最大深度没有这个要求。所以要对一侧子树为空的情况需要单独讨论。以下是代码实现: 最大深度递归分治后序遍历 需要调用自生函数,需要严格按照定义调用递归。 1234567891011121314151617// 定义:输入根节点,返回这棵二叉树的最大深度func maxDepth(root *TreeNode) int { if root == nil { return 0 } rightMaxDepth := maxDepth(root.Right) ...
Go语言中的byte类型与Unicode码点与整数的转换
byte类型与Unicode码点的转换在Go语言中,byte 类型是无符号的8位整数类型,而字符类型 rune 则用于表示Unicode码点。 当我们将一个 byte 类型的值转换为对应的 int 类型时,它实际上是将字节的数值直接转换为 int。这种转换通常用于将ASCII字符转换为对应的整数。 123456789101112package mainimport ( "fmt")func main() { b := byte('A') i := int(b) fmt.Printf("Byte: %c, Unicode码点: %d, 转换后的整数: %d\n", b, b, i)} 在上面的示例代码中,我们将字符 ‘A’ 转换为 byte 类型并赋值给变量 b,然后再将 b 转换为 int 类型并赋值给变量 i。输出结果如下: 1Byte: A, Unicode码点: 65, 转换后的整数: 65 可以看到,转换后的整数值与字符 ‘A’...
Mesh组网:家庭路由和无线连接新方式
在当今互联的世界中,传统的网络常常面临覆盖范围、可靠性和可扩展性方面的限制。Mesh组网作为一种解决方案应运而生,通过创建一个动态网络,使设备能够直接相互通信,形成一个弹性和高效的网络基础设施。本文将从what、how和why的角度探讨Mesh组网。 what Mesh组网是什么? Mesh组网是一种分散式无线通信系统,允许设备直接相互连接,形成交织在一起的节点网状结构。与传统的网络不同,依赖于中心接入点,Mesh网络使得设备能够同时充当客户端和路由器的角色。Mesh中的每个设备可以将数据中继到其他节点,扩大网络的覆盖范围并增强其鲁棒性。 how Mesh组网如何实现?...
链表总结
链表的合并 虚拟头节点 拉拉链 1234567891011121314151617181920212223242526272829303132func mergeTwoLists(l1 *ListNode, l2 *ListNode) *ListNode { // 虚拟头结点 dummy := &ListNode{-1, nil} p := dummy p1 := l1 p2 := l2 for p1 != nil && p2 != nil { // 比较 p1 和 p2 两个指针 // 将值较小的的节点接到 p 指针 if p1.Val > p2.Val { p.Next = p2 p2 = p2.Next } else { p.Next = p1 p1 = p1.Next ...
数组双指针刷题总结
双指针技巧分为快慢指针和左右指针 快慢指针 原地修改数组 遍历fast 去探路,探到符合条件的将其赋值给slow,并slow++ 去除有序数组/链表中去重 和上边类似,例如删除指定元素v: 遍历fast ,判断不符合该条件的(!=v),slow++; num[slow] == num[fast] 左右指针1.二分查找 * 有序,直接找中间的点,判断中间是否符合对应的题目逻辑,将中间点赋值为左边界或者右边界2.N sum 之和 * 一般是有序数组,然后左右相加,利用右边向内部移动数值减小和左边向内部移动数组变大3.反转字符串 * 终止条件是i>j4.回文串判断 * 判断条件s[i] == s[j]
leetcode 1170. 比较字符串最小字母出现频次
1170. 比较字符串最小字母出现频次 - 力扣(Leetcode) 后缀和(Prefix Sum)是一种常用于区间和计算的技巧。它通过预处理把一个数组的前缀和先计算出来,然后在查询某个区间的和时,只需要构造两个前缀和相减即可得到所求的区间和。 具体而言,假设有一个长度为 n 的整数数组 A,记 S[i] 为 A[0]+A[1]+…+A[i-1] 的前缀和,其中 0≤i<n。那么对于任何 0≤l≤r<n,A[l]+A[l+1]+…+A[r] = S[r+1]-S[l]。 在实际的应用中,如果需要进行多次区间和查询,可以利用后缀和技巧预处理出 A 数组的前缀和,并存储在一个新的数组 S 中。这样,对于任意区间 [l,] 查询,只需要计算 S[r+1]-S[l] 即可,时间复杂度为 O(1)。 不使用后缀和1234567891011121314151617181920212223242526272829303132func f(s string) int { cnt := 0 ch := 'z' for _, c...
什么是二进制的按位或和按位异或
按位或(bitwise OR)和按位异或(bitwise XOR)是两种二进制位运算。但是这两个概念很容易忘记或者混淆,今天我们就来加深一下印象吧! 按位或运算符(|)对两个二进制数的每一位都执行逻辑或操作,返回一个新的二进制数。其真值表如下 123456input bit a | input bit b | output ------------------------------- 0 | 0 | 0 0 | 1 | 1 1 | 0 | 1 1 | 1 | 1 例如,执行 6 (二进制位 110) 和 3 (二进制位 011) 的按位或运算 会得到 7 (二进制位 111): 12345 110| 011----- 111 按位异或运算符(^)对两个二进制数的每一位都执行逻辑异或操作,返回一个新的二进制数。其真值表如下: 1234567input bit a | input bit b |...