Golang 探究
探讨golang一些有趣的用法,记载开发的点点滴滴
pardon110
这个作者很懒,什么都没留下…
展开
-
合并K个已排序链表
需求合并 k 个已排序的链表并将其作为一个已排序的链表返回[{1,2,3},{4,5,6,7}] // 入参{1,2,3,4,5,6,7} // 返回分治+递归用二分法把列表进行中间拆分融合每个小列表中的链表,反向func mergeKLists( lists []*ListNode ) *ListNode { if lists == nil{ return nil }else if len(lists) == 1 { return l原创 2020-12-31 13:06:48 · 406 阅读 · 0 评论 -
go 原子数量
原子式给定一个化学式,输出所有原子的数量。格式为:第一个(按字典序)原子的名子,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。输入: formula = "K4(ON(SO3)2)2"输出: "K4N2O14S4"解释: 原子的数量是 {'K': 4, 'N': 2, 'O': 14, 'S': 4}。所有原子的第一个字母为大写,剩余字母都是小写。formula 的长度在[1, 1000]之间。formula 只包含字母原创 2020-12-28 12:59:08 · 283 阅读 · 0 评论 -
N皇后
代码func solveNQueens(n int) [][]string { rs := [][]string{} var queen func(int, []int) queen = func(cur int, q []int){ if cur == n { rs = append(rs, trans(q,n)) return } for i:=0;i < n;i++ {原创 2020-12-24 11:57:31 · 208 阅读 · 0 评论 -
单词搜索详解
题面给定一个二维网格和一个单词,找出该单词是否存在于网格中。单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。board =[ ['A','B','C','E'], ['S','F','C','S'], ['A','D','E','E']]给定 word = “ABCCED”, 返回 true给定 word = “SEE”, 返回 true给定 word = “ABCB”, 返回 fa原创 2020-12-21 11:31:42 · 646 阅读 · 0 评论 -
go 自定义最大堆 实现频率排序
题面给定一个字符串,请将字符串里的字符按照出现的频率降序排列。输入:"tree"输出:"eert"解释:'e’出现两次,'r’和’t’都只出现一次。因此’e’必须出现在’r’和’t’之前。此外,"eetr"也是一个有效的答案。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/sort-characters-by-frequency堆排序实现go 堆的 heap.Interface 接口自定义依据重复次数实现最大堆排序规则原创 2020-12-05 13:31:28 · 233 阅读 · 0 评论 -
golang 数组的相对排序
题面两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。输入:arr1 = [2,3,1,3,2,4,6,7,9,2,19], arr2 = [2,1,4,3,9,6]输出:[2,2,2,1,4,3,3,9,6,7,19]分析自定义排序,合理描述规则排序规则与索引,值,可哈希相关原创 2020-11-14 11:09:55 · 730 阅读 · 0 评论 -
滑动窗口 最小覆盖子串
基本模板定义状态向右增大窗口向左缩小窗口持续迭代void window(string s, string t) { unordered_map<char, int> window, target; for (char c : t) { ++target[c]; } int left = 0, right = 0; // 初始化双指针 ... // 定义状态值 while (right &l原创 2020-10-03 12:25:28 · 316 阅读 · 0 评论 -
golang 用栈实现路径求和
题面输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回[ [5,4,11,2], [原创 2020-10-01 11:45:18 · 157 阅读 · 0 评论 -
golang 递归 栈 生成括号
与序列相关的问题,参数栈+链表+循环的形式通常更高效对于复用性强,在递归生成括号往往就没有上述高效问题给出n对括号,请编写一个函数来生成所有的由n对括号组成的合法组合。例如,给出n=3,解集为:"((()))", "(()())", "(())()", "()()()", "()(())",递归关键 当前位置左括号不少于右括号golang 字符串不可变,故可用字节切片生成字符串append 生成的数据依赖于底层数组,有可变性,正常情况下用copy计数边界,分层递进与回溯,回溯期.原创 2020-09-27 16:37:26 · 152 阅读 · 0 评论 -
虚节点dummy
起源原因对链表而言因头结点的上一个节点不存在,很多对于其他节点,需要用上上一个节点的操作对头结点就不适合,通常就需要单独考虑头结点,若单独考虑头,一个不小心产生许多bug虚拟节点~dummy在链表的头部放入一个哨兵,然后连上head节点。之后就把head节点当做普通节点,就不用单独考虑各种奇葩问题了ListNode* dummy=new ListNode(-1); dummy->next=head;最后返回 return dummy->next;题面给定一原创 2020-09-26 19:51:56 · 1377 阅读 · 0 评论 -
golang 双重递归之路径总和
递归模型是计算机理论的强力支撑题面给定一个二叉树,它的每个结点都存放着一个整数值。找出路径和等于给定数值的路径总数。路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/path-sum-iiiroot = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3原创 2020-09-26 16:43:43 · 197 阅读 · 0 评论 -
golang 判断是否为二叉搜索树
引言使用数据范围可以,在合适的场景简化问题中序遍历的有序性方便判定二叉搜索树栈的多变性,在于并非是连续进或出, 而是进出不均等。如对弹出元素相关性分析,确定是否有新关联元素入栈,换而言之,当前出栈的元素连续的后一出栈元素,未必就是当下栈顶元素。如下所示,d 出 e入 再出是e而非最先留下的 c问题判断给出的二叉树是否是一个二叉搜索树(BST)二叉搜索树的定义如下一个节点的左子树上节点的值都小于自身的节点值一个节点的右子树上节点的值都大于自身的节点值所有节点的左右子树都必须是二叉搜原创 2020-09-24 17:49:38 · 361 阅读 · 0 评论 -
层序遍历的巧用
需求给定一个仅包含数字0-9 0−9 的二叉树,每一条从根节点到叶子节点的路径都可以用一个数字表示。例如根节点到叶子节点的一条路径是1→2→3,那么这条路径就用123 来代替。找出根节点到叶子节点的所有路径表示的数字之和这颗二叉树一共有两条路径,根节点到叶子节点的路径 12根节点到叶子节点的路径 13答案为 12+13=25常规思路先求得根节点到各自叶子节点路径将路径信息转为数字信息相加求和golang实现import "math"func sumNumbers( root原创 2020-09-24 12:00:58 · 194 阅读 · 0 评论 -
golang 非递归先序 与卡特兰数
非递归分析读取数据是出栈顺序出栈来自栈顶,与数据入栈顺序相反在出栈的同时,考察出栈元素可能产生新的入栈情况出栈的栈顶元素可能会产生新的入栈需求,一出多入,后入先出func preorderTraversal( root *TreeNode ) []int { if root == nil{ return nil } rs :=[]int{} stack :=[]*TreeNode{root} for len(stack)> 0 {原创 2020-09-21 23:18:31 · 257 阅读 · 0 评论 -
golang 中后序遍历构建二叉树
题面根据一棵树的中序遍历与后序遍历构造二叉树。假设树中没有重复的元素中序遍历 inorder = [9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回二叉树 3 / \ 9 20 / \ 15 7分析中序遍历将二叉树分成左右两棵子树 (左 根 右)后序遍历最后访问根结点 (左 右 根)递归建树因此可以递归建树先记住中序遍历中每个数出现的位置,通常用hash。(题目条件:不存在重复数,如果存在重复数会更原创 2020-09-17 13:17:54 · 380 阅读 · 0 评论 -
栈的春天 反转每对括号的子串
栈的使用花样百出,多栈会简化很多问题题面给出一个字符串 s(仅含有小写英文字母和括号)。请你按照从括号内到外的顺序,逐层反转每对匹配括号中的字符串,并返回最终的结果。注意,您的结果中 不应 包含任何括号。输入:s = "a(bcdefghijkl(mno)p)q"输出:"apmnolkjihgfedcbq"来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/reverse-substrings-between-each-pair-of-.原创 2020-09-14 12:45:57 · 175 阅读 · 0 评论 -
括号的分数
递归虽简单明了,但能不用尽量不用题面给定一个平衡括号字符串 S,按下述规则计算该字符串的分数:() 得 1 分。AB 得 A + B 分,其中 A 和 B 是平衡括号字符串。(A) 得 2 * A 分,其中 A 是平衡括号字符串。示例输入: "(()(()))"输出: 6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/score-of-parentheses递归本质 寻找拆解当层子串,及条件递归,加,乘法描述平衡字符.原创 2020-09-13 09:28:46 · 771 阅读 · 0 评论 -
来自数学的降维打击
问题给定正整数 n,找到若干个完全平方数(比如 1, 4, 9, 16, …)使得它们的和等于 n。你需要让组成和的完全平方数的个数最少。四平方定理任何正整数都可以拆分成不超过4个数的平方和 —> 答案只可能是1,2,3,4若一个数最少可以拆成4个数的平方和,则这个数还满足 n = (4^a)*(8b+7) —> 因此可以先看这个数是否满足上述公式,如果不满足,答案就是1,2,3了若这个数本来就是某个数的平方,那么答案就是1,否则答案就只剩2,3了如果答案是2,即n=a2+b2,那原创 2020-09-11 12:46:22 · 972 阅读 · 0 评论 -
golang 组合数总和
题面给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例输入:candidates = [2,3,6,7], target = 7,所求解集为:[ [7], [2,2,3]]回溯思想回溯算法实际上一个类似枚举的深度优先搜索尝试过程,主要是在搜索尝试原创 2020-09-09 20:11:28 · 757 阅读 · 0 评论 -
golang 栈之删除重复项
删除重复项使用golang双向链表重当栈import "container/list"import "strings"func removeDuplicates(S string) string { stack :=list.New() var b strings.Builder for i:=0;i<len(S);i++ { if stack.Len() > 0 { if stack.Back().Value.(b原创 2020-09-07 19:50:10 · 262 阅读 · 0 评论 -
php栈之数组与SplStack
SPL(php标准库)提供了SplStack 双链表结构类作为栈的实现类,也可用数组简单替代栈特点先进后出不像列表,有去无回,栈可返回,即天生具备回退功能栈由于一直是在一端操作,因此适合判断成双成对的场景匹配,当全部取完意味为空全部匹配删除最外层括号有效括号字符串为空 ("")、"(" + A + “)” 或 A + B,其中 A 和 B 都是有效的括号字符串,+ 代表字符串的连接。例如,"","()","(())()" 和 “(()(()))” 都是有效的括号字符串。如果有效字符串.原创 2020-09-06 19:01:15 · 340 阅读 · 0 评论 -
golang最大子序和
题面给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。分析比较老实的方法,计算所有可能的子序和,取最大值 M*N问题本质在于若干个子序和可能需要被重置,即确定重写的时机若上次求和值小于当前新进值且上次求和小于0,则sum 需要被置为新进程,后开始持续累加实现import "math"func ma原创 2020-09-04 20:38:43 · 169 阅读 · 0 评论 -
golang 外观数列
题面给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。注意:整数序列中的每一项将表示为一个字符串。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:作者:力扣 (LeetCode)链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnpvdm/来源:力扣(LeetCode)著作权归作者所有。商业转载请联系作者获得授权,非商业原创 2020-09-03 18:11:22 · 168 阅读 · 0 评论 -
golang 双指针滑动区间
思路双指针通常在滑动区间算法中使用,与KMP尽可能的复用已计算的信息思想一致。先确定可能的边界条件,预估充分出现在计算过程中动态调整指针区间,区间大小,移动求最大最小,至少要遍历一次给定的目标区,但可以M+N就不必M*N最大连续1的个数给定一个二进制数组, 计算其中最大连续1的个数。输入数组的长度是正整数,且不超过 10,000。输入: [1,1,0,1,1,1]输出: 3解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3.算法func findMaxCons原创 2020-09-03 10:22:28 · 408 阅读 · 0 评论 -
golang 实现 strstr
题面实现 strStr() 函数。分析KMP 不用了,高效但反人类排除特殊情况子串为空,返回0,其它未找到返回 -1子串窗口区间同步比对,被查串标识实现func strStr(haystack string, needle string) int { if len(haystack) < len(needle){ return -1 } if len(needle)==0 { return 0 } rs :=-1原创 2020-09-02 15:15:30 · 271 阅读 · 0 评论 -
golang 对角线遍历
题面给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。示例:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]![在这里插入图片描述](https://img-blog.csdnimg.cn/20200901185316306.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR原创 2020-12-24 12:01:04 · 240 阅读 · 0 评论 -
golang单链表反向
题面反转一个单链表输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL递归func reverseList(head *ListNode) *ListNode { if head == nil { return nil } if head != nil && head.Next==nil { return head }原创 2020-08-30 19:04:14 · 172 阅读 · 0 评论 -
golang 两两交换链表中的节点
题面给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例:给定 1->2->3->4, 你应该返回 2->1->4->3.来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/swap-nodes-in-pairs分析基例关系,约束退出条件,递归前依赖,与后依赖当层退出,不代表整个行为结束了,它会返回上一层(回退),执行上一层递归原创 2020-08-29 15:00:25 · 349 阅读 · 1 评论 -
goalng 之 二叉树的中序遍历
题面给定一个二叉树,返回它的中序 遍历。示例:输入: [1,null,2,3]12/3输出: [1,3,2]进阶: 递归算法很简单,你可以通过迭代算法完成吗?来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/binary-tree-inorder-traversal栈思想栈具有先进后出的特点,典型的记忆回退效果,下例栈在整个循环期从无到有,再至虚无是动态变化,大部分节点都访问了两次import "container/list"原创 2020-08-28 19:37:09 · 150 阅读 · 0 评论 -
golang 二进制链表转整数
题面给你一个单链表的引用结点 head。链表中每个结点的值不是 0 就是 1。已知此链表是一个整数数字的二进制表示形式。请你返回该链表所表示数字的 十进制值 。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/convert-binary-number-in-a-linked-list-to-integer输入:head = [1,0,1]输出:5解释:二进制数 (101) 转化为十进制数 (5)解法 type ListNode s原创 2020-07-23 11:25:37 · 207 阅读 · 0 评论 -
panic: sync: negative WaitGroup counter
问题先看报错信息Table: 0 grass: 0 match: 0Apple smokes a cigaretteTable chooses paper: SandyTable: 0 grass: 1 match: 1Table: 0 grass: 1 match: 0Table: 0 grass: 0 match: 0Sandy smokes a cigarettepanic: sync: negative WaitGroup countergoroutine 6 [running原创 2020-05-14 15:54:22 · 4557 阅读 · 0 评论 -
colly 自动抓取资讯
colly 在golang中的地位,比之scrapy在python的作用,都是爬虫界的大佬。本文用其抓取博文资讯, 从收集器实例配置,goQuery进行dom节点数据抓取,自动分页访问,到csv数据持久化,json控制台输出,全程简单直观。Code抓取数据入口为社区用户博客列表页,比如 https://learnku.com/blog/pardonpackage mainimport...原创 2019-12-20 16:19:20 · 639 阅读 · 0 评论 -
ferret 爬取动态网页
动态网页常用js来加载数据,使用声明式语言fql,可轻松获取点击,下拉等一系列需要交互后渲染的页面数据够浪的ferret足够简单, 让会sql,了解css,知道点go的同学,很方便的用编码或命令行形式抓取动态网页内容。seleniumselenium真心好用,但太重。夸它好用,是因为不像scray一个页面情况没考虑到,它就给挂了,给定目标网站用户让怎么跑就怎么干。说它重是因为耗资源,若仅...原创 2019-12-15 10:45:12 · 557 阅读 · 0 评论 -
golang 图片操作速览
base64 -> file// 成图片文件并把文件写入到bufferddd, _ := base64.StdEncoding.DecodeString(datasource) // buffer输出到jpg文件中(不做处理,直接写到文件)err2 := ioutil.WriteFile("./output.jpg", ddd, 0666) datasource base64 ...原创 2019-12-13 16:23:16 · 916 阅读 · 0 评论 -
大话状态协程
引言与用互斥锁进行明确的锁定来让共享的 state 跨多个 Go 协程同步访问, 在golang中,更多的是基于通道的方法和Go 协程间通过通讯来共享内存。如果你对此已有所了解,本文对你毫无意义。数据竟争数据竞争,本质是多个请求对应同一共享数据的争抢,要么给数据上把锁,要么让请求排队,一个个上。用锁好比上公共洗手间,假定只有一个坑位,多个人同时来了,都有需求。进去的人关门上锁,外面的人等...原创 2019-12-05 12:34:11 · 102 阅读 · 0 评论 -
大话通道
稍微有编码常识的同学,都会意识到程序并非完全按照纯代码逻辑顺序执行。有多线程多进程经验,知道程序执行往往表现的像无规律的交叉,而且每次重新来过,还体现不一样。 本文以通道为引子,意直白讲述并发同步内存顺序编译器(在编译时刻)优化和CPU处理器优化(运行时),会调整指令的执行地顺序。这导致指令执行顺序与代码指定的顺序不完全一致。所以当你认为你的代码是按照书写的逻辑执行时,事实有可能并非如此...原创 2019-12-05 12:33:10 · 106 阅读 · 0 评论 -
拖拽传图 Iris + DropzoneJS
Iris官方其实很厚道,有很多有用的例子,而社区则是文档多于实战。源于官方示例库([英文源文])(https://github.com/kataras/iris/tree/master/_examples/tutorial/dropzonejs),本文采用 DropzoneJS and Go实现图片上传,后端裁剪,前端呈现,代码量少但胜在实用,适合新同学实战。涉及的点DropzoneJS...原创 2019-12-05 12:31:33 · 431 阅读 · 0 评论 -
大话 goroutine
goroutine本质上是大号版的异步执行句柄,比之nodejs中的单线程事件循环处理器。之所以在使用goroutine,感觉不到异步,在于golang已经封装了各种异步io操作,运行时一旦发现异步io状态发生改变,则适时进行goroutine切换。让你基本上感觉不到像基于事件编程所带来的直观上的任务执行乱序。启动 VS 执行goroutine 这种由运行时控制,构建于线程之上,又比线程粒...原创 2019-12-05 12:25:35 · 159 阅读 · 0 评论 -
Golang实现Telnet回音服务器
码上见package mainimport ( "bufio" "fmt" "net" "os" "strings")// 服务端连接func server(address string, exitChan chan int) { l, err := net.Listen("tcp", address) if err != nil { fmt.Println(...原创 2019-06-05 11:47:42 · 1241 阅读 · 0 评论 -
golang 之匿名结构体解析JSON数据
package mainimport ( "encoding/json" "fmt")// 定义手机屏幕type Screen struct { Size float32 ResX, ResY int}// 定义电池type Battery struct { Capacity int}// 生成json数据func getJsonData() []...原创 2019-06-04 13:21:45 · 1897 阅读 · 0 评论