- 博客(84)
- 资源 (7)
- 问答 (1)
- 收藏
- 关注
原创 GopherChina 2020 Go Programming Patterns 学习笔记篇2
本篇继续学习左耳朵耗子老师的Go Programming Patterns下半部分,PPT太长了,70多页。 Topic 10 函数化的选项配置 由于Golang不允许使用同一个名字来命名函数,必须是不同的名称,即使参数不同,这与Java不一样,java的方法签名是包含参数的。所以遇到那种多个参数来实例化一个变量的,就会比较麻烦。会有类似代码产生: type Server struct { Addr string Port int Protocol string Timeout time.Dura
2020-12-09 18:22:00
382
原创 GopherChina 2020 Go Programming Patterns 学习笔记篇1
今天学习的是左耳朵耗子老师的 Go Programming Patterns Topic 1 Slice 我们知道Slice是一个结构体 type SliceHeader struct { Data uintptr Len int Cap int } 一个var a []int 是nil,但是它的len和cap都将是零,因为值是初始化这个slice结构体的零值,即 SliceHeader{ Data: nil, Len: 0, Cap: 0, } PPT里讨论的是slice的共享内存,在
2020-11-27 16:15:13
486
原创 Golang 基本类型字符串、数组和Slice
字符串String 字符串的底层表示 type StringHeader struct { Data uintptr Len int } Data 指向底层的字符数组 Len 表示字符串的长度 Go语言中,所有的文件都采用UTF-8编码,字符常量也是用的是UTF-8字符编码集。UTF-8 是可变长的编码方式,比如ASCII码 就用一个字节表示,中文就是3个字节表示。我记得ASCII的UTF-8编码是最高位为0。 使用range 轮询字符串,所出来的是utf-8编码的符文rune。比如"Hello你
2020-08-12 13:43:29
757
原创 Golang 逃逸分析
以下摘自https://studygolang.com/articles/21788和https://zhuanlan.zhihu.com/p/91559562,仅做笔记使用。 1. 为什么要做逃逸分析 我们提到go语言中对象内存的分配不是由语言运算符或函数决定,而是通过逃逸分析来决定。为什么要这么干呢?其实说到底还是为了优化程序。 如果分配到栈上,待函数返回资源就被回收了 如果分配到堆上,函数返回后交给gc来管理该对象资源,栈资源的分配及回收速度比堆要快,所以逃逸分析最大的好处应该是减少了GC的压力。
2020-08-12 13:38:28
429
原创 Golang 深入浅出map
网上很多博客都对map的内部实现讲了很多,很多人可能看完都绕晕了,看完可能装载因子是多少,扩容倍率是多少还是没搞清楚。没错我就是这样子,QAQ。 直接给出结果,装载因子6.5,扩容倍率是2倍,采用拉链法。这个拉链法并不是传统意义上的数组加链表,而是数组桶加数组的形式。接下来我们一步一步简单说明好了。 map的创建,一般是通过make来初始化的,编译时会将make替换为如下的runtime makemap。可以看到,它返回的是一个叫做hmap的指针,这也是为何说map是一个指针,所以参数传递放心大胆的传,内部
2020-08-11 00:03:43
928
2
原创 Go语言中Goroutine如何退出
在Go语言中,启动一个协程Goroutine很方便,一行代码的事儿,比如go runTask()。但是如果runTask要在运行中途退出呢?有人说用channel,那么如何在web请求中,每次拿到那个channel呢?没写过的人,一时半会还真想不清楚。 我们在web请求中,启动了一个goroutine来运行某个任务,就像这样 go runTask()。它的内部是一个for循环,循环获取数据,同时检查任务的运行状态。如果不再是运行状态了,就可以退出了。 如果我们的流程是这样的,启动任务A,假设它跑在gorou
2020-07-23 19:16:21
1661
原创 leetcode 探索 哈希表 快乐数
题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。如果 可以变为 1,那么这个数就是快乐数。 如果 n 是快乐数就返回 True ;不是,则返回 False 。 示例: 输入:19 输出:true 解释: 1^2 + 9^2 = 82 8^2 + 2^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1 分析 这
2020-07-11 08:58:45
218
原创 leetcode 探索 哈希表 两个数组的交集
题目 给定两个数组,编写一个函数来计算它们的交集。 示例 1: 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出:[2] 示例 2: 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出:[9,4] 说明: 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 分析 通过遍历一遍数组1,然后加入到map中。这样再遍历数组2,遇到数组1中有的,就加入结果集,同时要注意到题目要求结果集是唯一的,那么我们在遇到过之后,就要把map中
2020-07-11 08:50:41
256
原创 leetcode 探索 哈希表 只出现一次的数字
题目 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1 示例 2: 输入: [4,1,2,1,2] 输出: 4 分析 此题有两种解法,第一种借用辅助空间来实现,遍历一遍记录每个元素出现的次数。再遍历一次,找出只出现一次的元素。 第二种就比较巧妙了,使用了位运算异或,即所有数如果相同,那么他们的结果就会为0,因为相同。所以把所有
2020-07-11 08:28:34
232
原创 leetcode探索 哈希表 存在重复元素
题目 给定一个整数数组,判断是否存在重复元素。 如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。 示例 1: 输入: [1,2,3,1] 输出: true https://leetcode-cn.com/explore/learn/card/hash-table/204/practical-application-hash-set/805/ 分析 使用hashmap,循环时候,判断当前数值是否已经在map中了。 解法 func containsDup
2020-07-11 08:21:29
318
原创 leetcode 探索 队列与栈 用队列实现栈
题目 使用队列实现栈的下列操作: push(x) – 元素 x 入栈 pop() – 移除栈顶元素 top() – 获取栈顶元素 empty() – 返回栈是否为空 分析 用go里的slice就好了。 解法 type MyStack struct { Space []int } /** Initialize your data structure here. */ func Constructor() MyStack { return MyStack{} } /** Push ele
2020-07-08 23:36:17
157
原创 leetcode 探索 队列与栈 用栈实现队列
题目 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 分析 用两个栈即可实现队列,push不变,只要在pop时候把push的栈,导入到另外一个栈,即实现了栈的倒置,也就是队列。A栈后进先出,比如push进去1 2 3 4 5,那么出栈就是5 4 3 2 1。将出栈的元素再入栈到栈B,则变成5 4 3 2 1。所以1又到了第一位。 解法 type MyQueue s
2020-07-08 23:29:06
173
原创 leetcode 探索队列与栈 克隆图
题目 给你无向 连通 图中一个节点的引用,请你返回该图的 深拷贝(克隆)。 图中的每个节点都包含它的值 val(int) 和其邻居的列表(list[Node])。 class Node { public int val; public List<Node> neighbors; } 测试用例格式: 简单起见,每个节点的值都和它的索引相同。例如,第一个节点值为 1(val = 1),第二个节点值为 2(val = 2),以此类推。该图在测试用例中使用邻接列表表示。 邻接列表 是用
2020-07-07 08:53:11
193
原创 leetcode 探索队列与栈 逆波兰表达式
题目 根据 逆波兰表示法,求表达式的值。 有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。 说明: 整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。 示例 1: 输入: [“2”, “1”, “+”, “3”, “*”] 输出: 9 解释: 该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9 分析 逆波兰表达式,其实就是扫描到运算符的时候,就从栈里弹出两个元素进行计算,计算
2020-07-03 08:36:59
157
原创 leetcode 探索队列与栈 每日温度
题目 请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。 例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。 提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。 分析 这个题第一个想法是双指针,即从左侧向
2020-07-03 08:33:39
268
原创 leetcode探索队列与栈 有效的括号
题目 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 示例 1: 输入: “()” 输出: true 示例 2: 输入: “()[]{}” 输出: true 分析 这题比较简单,使用栈的LIFO的特性,如果是左边的括号就进栈,如果是右边的括号,就与栈顶元素比较,是他的另外一边,就弹栈。继续前进,利用了括号成对的特性,即最内层的左括号
2020-07-03 08:26:40
176
原创 leetcode 探索队列与栈 最小栈
题目 设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 push(x) —— 将元素 x 推入栈中。 pop() —— 删除栈顶的元素。 top() —— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。 示例: 输入: [“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”] [[],[-2],[0],[-3],[],[],[],[]] 输出: [null,null,null,nu
2020-07-03 08:21:26
177
原创 leetcode 探索 队列与栈 完全平方数
题目 给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。 示例 1: 输入: n = 12 输出: 3 解释: 12 = 4 + 4 + 4. 示例 2: 输入: n = 13 输出: 2 解释: 13 = 4 + 9. 分析 仍然是广度优先搜索BFS,注意step的增加,要每一轮或者说每一圈搜索结束后,再增长。 BFS三大核心,visited,queue,step。 解法 func numSquares(n int
2020-07-03 00:22:46
239
原创 leetcode 探索 队列与栈 打开转盘锁
题目 你有一个带有四个圆形拨轮的转盘锁。每个拨轮都有10个数字: ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’ 。每个拨轮可以自由旋转:例如把 ‘9’ 变为 ‘0’,‘0’ 变为 ‘9’ 。每次旋转都只能旋转一个拨轮的一位数字。 锁的初始数字为 ‘0000’ ,一个代表四个拨轮的数字的字符串。 列表 deadends 包含了一组死亡数字,一旦拨轮的数字和列表里的任何一个元素相同,这个锁将会被永久锁定,无法再被旋转。 字符串 target 代表可以解锁的数
2020-07-01 00:01:06
149
原创 leetcode 每日打卡 用两个栈实现队列
题目 用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 ) 示例 1: 输入: [“CQueue”,“appendTail”,“deleteHead”,“deleteHead”] [[],[3],[],[]] 输出:[null,null,3,-1] 示例 2: 输入: [“CQueue”,“deleteHead”,“appendTai
2020-06-30 14:59:30
361
原创 leetcode 探索 队列与栈 岛屿数量
题目 给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。 岛屿总是被水包围,并且每座岛屿只能由水平方向或竖直方向上相邻的陆地连接形成。 此外,你可以假设该网格的四条边均被水包围。 示例 1: 输入: 11110 11010 11000 00000 输出: 1 示例 2: 输入: 11000 11000 00100 00011 输出: 3 解释: 每座岛屿只能由水平和/或竖直方向上相邻的陆地连接而成。 来源:力扣(LeetCode) 链接:https://leetc
2020-06-30 09:29:11
268
原创 leetcode 1496 判断路径是否相交
题目 给你一个字符串 path,其中 path[i] 的值可以是 ‘N’、‘S’、‘E’ 或者 ‘W’,分别表示向北、向南、向东、向西移动一个单位。 机器人从二维平面上的原点 (0, 0) 处开始出发,按 path 所指示的路径行走。 如果路径在任何位置上出现相交的情况,也就是走到之前已经走过的位置,请返回 True ;否则,返回 False 。 示例1 输入:path = “NES” 输出:false 解释:该路径没有在任何位置相交。 提示: 1 <= path.length <= 10^
2020-06-29 22:43:41
1176
原创 leetcode 215 数组中的第K个最大元素 Go实现
题目 未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 示例 1: 输入: [3,2,1,5,6,4] 和 k = 2 输出: 5 示例 2: 输入: [3,2,3,1,2,4,5,5,6] 和 k = 4 输出: 4 说明: 你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kth-largest-elem
2020-06-29 09:05:37
373
原创 leetcode 探索 队列和栈 设计循环队列
题目 设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。 循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。 你的实现应该支持如下操作: MyCircularQueue(k): 构造器,设置队列长度为 k 。 Front: 从队首获取元素。如果队列为空,返回
2020-06-28 23:54:58
390
原创 leetcode 5499 检查数组对是否可以被K整除
题目 给你一个整数数组 arr 和一个整数 k ,其中数组长度是偶数,值为 n 。 现在需要把数组恰好分成 n / 2 对,以使每对数字的和都能够被 k 整除。 如果存在这样的分法,请返回 True ;否则,返回 False 。 示例 1: 输入:arr = [1,2,3,4,5,10,6,7,8,9], k = 5 输出:true 解释:划分后的数字对为 (1,9),(2,8),(3,7),(4,6) 以及 (5,10) 。 来源:力扣(LeetCode) 链接:https://leetcode-cn
2020-06-28 22:39:10
361
原创 leetcode 探索 链表 复制带随机指针的链表
题目 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。 要求返回这个链表的 深拷贝。 我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示: val:一个表示 Node.val 的整数。 random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。 示例1: 输入:head = [[7,null],[13,0],[11,4],[10,2],[
2020-06-27 12:06:23
150
原创 leetcode 探索 链表 旋转链表
题目 给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1->2->3->NULL 示例 2: 输入: 0->1->2-
2020-06-27 11:22:01
155
原创 leetcode 探索 链表 扁平化多级双向链表
题目 多级双向链表中,除了指向下一个节点和前一个节点指针之外,它还有一个子链表指针,可能指向单独的双向链表。这些子列表也可能会有一个或多个自己的子项,依此类推,生成多级数据结构,如下面的示例所示。 给你位于列表第一级的头节点,请你扁平化列表,使所有结点出现在单级双链表中。 输入:head = [1,2,3,4,5,6,null,null,null,7,8,9,10,null,null,11,12] 输出:[1,2,3,7,8,11,12,9,10,4,5,6] 解释: 输入的多级列表如下图所示: 扁平
2020-06-26 17:53:22
289
原创 leetcode 探索 链表 两数相加
题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists 分析 合并链表,此题比较简单,但要注意的事情有以下三点。 该位上的和如果大于等于10的话,需要进位,那么需要将
2020-06-26 17:18:36
141
原创 leetcode 探索 链表 合并两个有序链表
题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例: 输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/merge-two-sorted-lists 分析 新建一个头节点,然后两两比较就好了,谁小谁链接上,只是需要判断边界条件。 解法 /** * Defini
2020-06-26 16:39:24
130
原创 leetcode 探索 链表 设计链表II双向链表
题目 设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val 和 next。val 是当前节点的值,next 是指向下一个节点的指针/引用。如果要使用双向链表,则还需要一个属性 prev 以指示链表中的上一个节点。假设链表中的所有节点都是 0-index 的。 在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。 addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表
2020-06-26 16:07:57
311
原创 leetcode 面试题02.01 移除重复节点
题目 编写代码,移除未排序链表中的重复节点。保留最开始出现的节点。 示例1: 输入:[1, 2, 3, 3, 2, 1] 输出:[1, 2, 3] 示例2: 输入:[1, 1, 1, 1, 2] 输出:[1, 2] 提示: 链表长度在[0, 20000]范围内。 链表元素在[0, 20000]范围内。 进阶: 如果不得使用临时缓冲区,该怎么解决? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-duplicate-node-lcc
2020-06-26 11:52:18
303
原创 leetcode 探索 链表 回文链表
题目 请判断一个链表是否为回文链表。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 分析 这题有两个解法, 一是新建一个数组,将每个链表元素,加入到数组中,然后通过双指针,一个指向首,一个指向尾,依次比较,空间复杂度O(N), 时间复杂度O(N+N/2) 二是通过快慢指针,迅速定位到中心点,然后翻转中心点后的链表,然后将翻转后的链表与初始链表的从头开始比较。这是比较难以想到的解法。 解法 /** * Def
2020-06-26 11:00:46
126
原创 leetcode 探索 链表 奇偶链表
题目 给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。 请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。 示例 1: 输入: 1->2->3->4->5->NULL 输出: 1->3->5->2->4->NULL 应当保持奇数节点和偶数节点的相对顺序。 链表的第一个节点视为奇数节点,第二个
2020-06-25 16:43:58
356
原创 leetcode 探索 链表 移除链表元素
题目 删除链表中等于给定值 val 的所有节点。 示例: 输入: 1->2->6->3->4->5->6, val = 6 输出: 1->2->3->4->5 来源Leetcode: https://leetcode-cn.com/problems/remove-linked-list-elements/ 分析 遇到这种经典的链表题的时候,我懵逼了,我不会。。。绕头脑,稍微不注意就会绕进去了,就不知道指针指哪里了。所以这题我要好好分析分析,好好
2020-06-25 15:40:37
202
原创 leetcode 探索 链表 反转链表
题目 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-linked-list 分析 反转链表,一遍循环,为了让2指向1,又不丢失下一个节点,就要让2的下一个节点先取出来存为temp,然后在
2020-06-25 11:56:08
158
原创 leetcode 探索 链表 删除链表的倒数第N个节点
题目 给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 1->2->3->5. 说明: 给定的 n 保证是有效的。 进阶: 你能尝试使用一趟扫描实现吗? 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list 分析 双
2020-06-24 23:19:53
178
原创 leetcode 探索 链表 相交链表
题目 编写一个程序,找到两个单链表相交的起始节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [
2020-06-24 22:45:22
144
原创 leecode 探索 链表 环形链表 II
题目 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1 解释:链表中有一个环,其尾部连接到第二个节点。 来源:力扣(LeetCode) 链接:https://leet
2020-06-24 09:43:58
187
原创 leetcode 探索 链表 环形链表
题目 给定一个链表,判断链表中是否有环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/linked-list-cycle 分析 如果有环,那么用双指针,一个每次走两步,
2020-06-24 00:11:59
190
物联网智能家居发展分析
2012-09-03
中国智能家居的现状及发展趋势
2012-09-03
智能家居中视频监控系统设计
2012-09-03
Android解析JSON数据出错
2013-12-17
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅