
golang
Dandelion_Promise
记录学习点滴,积少成多
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
golang实现循环队列
当容量为k时,我们初始化一个容量为k+1的数组arr,方便区分队列空和满。当(rear+1) % len(arr) == front时,判断队列为满;当rear==front时,判断队列为空;原创 2024-03-19 00:12:18 · 535 阅读 · 0 评论 -
go语言实现堆排序
因此,我们可以从堆顶取出元素, 与数组最后一位交换,然后重新维护堆的性质,再取堆顶元素和最后第二位交换…长度为n的数组,最后一个元素下标为n-1, 所以它的父级下标为 (n-1-1) / 2 = n/2 - 1。堆排序指利用堆的性质进行排序的算法。当我们要给下标为i的节点,调整为满足堆的性质可以这样定义一个方法。注意: 我们需要从最后一个父节点开始调整堆。大顶堆:所有父节点的值大于大于子节点的值。小顶堆:所有父节点的值小于大于子节点的值。这是一个未排序的数组,对应的二叉堆。通常我们用数组来实现堆,原创 2023-03-17 15:23:48 · 656 阅读 · 0 评论 -
golang实现多生产者多消费者模式
多生产者、多消费者,利用通道传递数据,WaitGroup控制生产者、消费者执行结束。原创 2023-05-24 11:11:30 · 1338 阅读 · 0 评论 -
go语言GC原理
golang GC原理三色标记清除法写屏障技术三色标记清除法原理:第一步:标记开始,把所有对象放到白色集合中(这一步需 STW)第二步:从根对象开始遍历,把遍历到的白色对象放到灰色集合中第三步:开始遍历灰色对象,把灰色对象所引用的白色对象从白色集合移到灰色集合,同时把遍历过的灰色对象移到灰色集合中第四步:重复第三步,直到灰色集合中没有对象第五步:剩余白色集合中的对象就是不可达对象,视为垃圾,清除掉写屏障技术在标记的过程中,对象的引用可能会改变,导致一些对象被引用最后任然为白色,被清除掉原创 2021-12-12 21:05:14 · 532 阅读 · 0 评论 -
生成括号
题目: 输入一个正整数n,输出n对括号所有合法的情况leetcode链接package mainimport ( "fmt")func main() { fmt.Println(getAllKuohao(3))}func getAllKuohao(n int) []string { var ret []string _getAllKuohao(0, 0, 2 * n, "", &ret) return ret}func _getAllKuohao(left,原创 2021-05-19 10:08:29 · 138 阅读 · 0 评论 -
两个协程交替顺序打印字符串
思路:利用无缓冲通道的阻塞特性func printStr(s string) { ch1 := make(chan int) ch2 := make(chan int) go func() { for i:=0; i<len(s); i++ { ch1 <- i if i % 2 == 0 { fmt.Println("g1:", string(s[i])) } <- ch2 } }() go func() { for i:=0;原创 2021-05-18 14:16:24 · 581 阅读 · 0 评论 -
go语言基础知识汇总图谱
原创 2021-03-10 14:09:57 · 137 阅读 · 0 评论 -
从无序数组中找到所有比左边大比右边小的元素
package mainfunc GetPivotElements(arr []int) []int { length := len(arr) if length < 3 { return []int{} } minIndex := make([]int, length) minIndex[length-1] = arr[length-1] for i := length - 2; i >= 0; i-- { if arr[i] < minIndex[i+1] {原创 2021-02-22 14:09:24 · 1170 阅读 · 0 评论 -
合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素。示例1:输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]示例2:输入:nums1 = [1], m = 1原创 2021-01-26 10:38:51 · 113 阅读 · 0 评论 -
合并两个有序链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。输入:1->2->4, 1->3->4输出:1->1->2->3->4->4/** * Definition for singly-linked list. * type ListNode struct { * Val int * Next *ListNode * } */func mergeTwoLists(l1 *ListNode, l2 *原创 2021-01-26 09:37:56 · 112 阅读 · 0 评论 -
golang实现二叉树前序、中序、后序遍历
type TreeNode struct { Value int Left *TreeNode Right *TreeNode}// 前序遍历func preorderTraversal(node *TreeNode) { if node == nil { return } fmt.Println(node.Value) preorderTraversal(node.Left) preorderTraversal(node.Right)}// 中序遍历func midOr原创 2020-12-17 17:22:05 · 703 阅读 · 0 评论 -
(摩尔投票法)在一次选举投票中,有一个候选人的投票超过了50%,在选票中找出这个候选人。
思路:投票法,定义两个变量,一个记录当前候选人编号,一个记录候选人票数。遍历,遇到相同的编号计数加1,不同的减1,为0时,更换候选人编号。func getMaxVoteNum(arr []int) int { major := arr[0] count := 0 for i := 0; i < len(arr); i++ { if major == arr[i] { count++ } else { if count == 0 { major = arr[i]原创 2020-12-17 17:16:45 · 321 阅读 · 0 评论 -
golang实现判断链表是否有环
一个单向链表,判断链表中是否存在环,如果存在环找到环的入口位置并返回,如果不存在环则返回空。思路:定义快、慢指针,从链表头开始,快指针每次走两步,慢指针每次走一步,如果相遇,说明有环。碰撞之后慢指针回到链表头部,快慢指针每次走一步,第一次相遇就是环入口。func getLinkCircle(head *Node) *Node { fast := head last := head cur := head for cur != nil && cur.Next != nil {原创 2020-12-17 17:14:22 · 1387 阅读 · 0 评论 -
golang实现算法题合集二
1. 判断链表是否有环,如果有环找到环入口思路:定义快、慢指针,从链表头开始,快指针每次走两步,慢指针每次走一步,如果相遇,说明有环。碰撞之后慢指针回到链表头部,快慢指针每次走一步,第一次相遇就是环入口。func getLinkCircle(head *Node) *Node { fast := head last := head cur := head for cur != nil && cur.Next != nil { last = last.Next fast =原创 2020-12-09 11:00:52 · 417 阅读 · 0 评论 -
golang实现算法题合集一
1. 找到一个数组中第二大的数思路: 定义一个最大值和第二大值变量,遍历一次数组。需要注意的是最大值可能有多个。func getMax(arr []int) int { // 初始化 maxNum := arr[0] secondMaxNum := arr[1] if maxNum < secondMaxNum { maxNum, secondMaxNum = secondMaxNum, maxNum } for i := 0; i < len(arr); i++ { i原创 2020-12-08 17:49:09 · 628 阅读 · 0 评论 -
go语言实现基本排序(二)
归并排序func MergeSort(arr []int) []int { if len(arr) < 2 { return arr } mid := len(arr) / 2 left := arr[0:mid] right := arr[mid:] return Merge1(MergeSort(left), MergeSort(right))}func Merge(left, right []int) []int { var result []int for len(原创 2020-12-03 22:39:23 · 149 阅读 · 0 评论 -
golang之翻转字符串
解题思路: 以字符串中间字符为中心,遍历交换前后字符来达到翻转的目的, 任何语言都可以这样实现。我们只需要求出字符串到长度就可以了,请看下面的例子: str := "hello世界" fmt.Println(len(str))运行结果:11是不是跟你想象的有点不一样。我们都知道在golang中字符串是由[]byte实现的, 求字符串的长度就是求字节数组的长度,而一个中文字符在unicode下占2个字节,在utf-8中占三个字节,golang的默认编码就是utf-8。所以hello世界的长度原创 2020-11-26 14:50:05 · 1652 阅读 · 0 评论 -
go语言实现基本排序(一)
1.冒泡排序(Bubble Sort)比较相邻的两个数大小,交换位置。平均时间复杂度O(n^2), 最好情况下为O(n), 空间复杂度为O(1)。func BubbleSort(arr []int) []int { for i := 0; i < len(arr); i++ { for j := 0; j < len(arr)-i-1; j++ { if arr[j] > arr[j+1] { arr[j], arr[j+1] = arr[j+1], arr[j]原创 2020-11-26 11:59:58 · 546 阅读 · 0 评论 -
golang之flag包详解
在golang中有很多方法来处理命令行参数,简单情况下可以不使用任何库,直接使用os.Args;但是golang标准库提供了flag包来处理命令行参数;还有第三方提供的处理命令行参数的库cobra、cli。flag包绑定解析参数有三种定义方式flag.xxx() 例如:flag.Int, flag.String, 返回解析变量类型的指针package mainimport ( "flag" "fmt")func main() { host := flag.Stri原创 2020-11-25 15:55:02 · 15052 阅读 · 0 评论