
go
LYue123
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
单链表的实现-go
在leetcode上刷题,遇到了很多关于链表的问题,今天就回顾一下,go语言中关于单链表的实现,主要是链表的创建,添加,插入,删除,获取,话不多说,上代码:package mainimport "fmt"type Node struct { //定义结点 data int //节点的值 next *Node //后继结点}type List...原创 2019-01-14 13:58:57 · 206 阅读 · 0 评论 -
go语言实现排序--插入排序
直接插入排序相信大家对直接插入排序都不陌生,通俗来说就是每次取要排序数组内的第i个数,在前i-1个数中,进行比较,找到正确的位置,插入即可。代码:func Insert(nums []int,n int) []int{ //直接插入排序 for i:=1;i<n;i++{ num:=nums[i] end:=i-1 for end>=0 && ...原创 2019-03-08 08:09:03 · 528 阅读 · 0 评论 -
go语言实现排序--选择排序
直接选择排序大家都知道我们一般不会用直接选择排序,因为时间复杂度比较高,相信大家对直接插入排序都不陌生,就是每次确定一个当前的最小值或者最大值,我也在这个基础上进行了一点小改进,即每次都确定一个最大值和最小值代码:func SelectSort(nums []int,n int) []int{ first:=0 end:=n-1 for first<end{ ...原创 2019-03-08 08:58:25 · 356 阅读 · 0 评论 -
go--双链表的实现(增删改查)改进版
之前就写过双链表的实现,但是今天看的时候发现了一个问题,就是在查询元素的时候并没有好好利用双链表的特性,所以今天又重新编辑了一下,大家看看区别代码:package mainimport "fmt"type Node struct { data int pre *Node Next *Node}type DoubleList struct { Head *Node leng...原创 2019-03-20 10:50:37 · 281 阅读 · 0 评论 -
go语言实现排序--交换排序
冒泡排序冒泡排序更是入门级级别的排序方法,不多说什么了,时间复杂度(最好 O(n),最坏O(n^2)),空间复杂度:O(1)代码:func MaoPao(nums []int ,n int) []int{ for i:=n;i>0;i--{ flag:=false for j:=1;j<i;j++{ if nums[j-1]>nums[j]{ num...原创 2019-03-08 09:56:54 · 307 阅读 · 0 评论 -
go---AVL(二叉平衡树的实现)
今天看了二叉平衡树,以前也接触过但是没实现过,今天就把他实现了一下,先简单介绍一下。首先我们要明白AVL树本质上还是二叉搜索树,只是做了平衡优化,首先插入的时候,此时树是平衡的,所以我们要判断插入之后是否平衡,不平衡的话就通过旋转弄平衡,注意是先插入,再平衡,不平衡的情况有四种对左儿子的左子树进行插入,左左旋转对左儿子的右子树进行插入,左右旋转对右儿子的右子树进行插入,右右旋转对右儿子的...原创 2019-03-20 19:57:32 · 293 阅读 · 0 评论 -
go语言实现--归并排序
归并排序归并排序实际上是对分治法的一个利用,将一个大的数组分成小的处理,再合并,我在实现过程中,有两个点是比较容易出错的,希望大家看了以后等注意起来,不要出错先看代码:func MergeSort(arr []int ,first,end int){ if first<end{ mid:=(end+first)/2 ...原创 2019-03-21 11:03:20 · 738 阅读 · 0 评论 -
链表的逆序
链表的逆序就是剑指offer中从尾到头打印链表不难想出就是利用栈的使用,从链表的头部开始依次将元素放入栈中,然后遍历结束后,将栈中的元素全部出栈,即为逆序,让我们看看代码实现因为go中不提供栈,所有我下面用切片代替,建议大家练习时,可以用栈实现func PrintList(node *ListNode){ res:=[]int{} if node==nil{ return } f...原创 2019-03-21 11:17:30 · 346 阅读 · 0 评论 -
二叉树树的前,中,后序遍历非递归--go语言实现
递归遍历二叉树非常简单,只要交换调用顺序即可,那么非递归呢,我这里都是借用栈的思想实现的前序遍历实现:第一次访问的时候就记录到结果数组中,然后进栈,依次访问其左孩子,知道左孩子为空弹出栈顶,访问其右孩子,循环这个过程,直到栈为空,root也为空代码:func (root *TreeNode) preorder() []int{ //非递归前序遍历 res:=[]int{} ...原创 2019-03-27 08:54:53 · 2163 阅读 · 2 评论 -
new()和make()的区别--go语言
有的时候容易将new()和make()弄混,他们都是在为变量分配内存空间时用到的,但是他们其实有很大的不同,我们结合例子说明一下new()new()是go语言的内建函数,他的声明如下func new(Type) *Type解析一下就是,内建函数 new 用来分配内存,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配类型零值的指针什么时候会用到呢,我们看一下下面的例子p...原创 2019-03-31 09:06:32 · 400 阅读 · 0 评论 -
go---用两个栈实现队列
相信大家对这个题目都不陌生,中心思想就是,队列中包含两个栈,一个栈作为储存入队操作的,另一个栈作为储存出栈操作的,但是,在goland中,是没有栈这种数据结构的,那又有什么关系,goland还有万能的切片啊,所以我们先用切片实现栈,再用栈实现队列代码:package mainimport "fmt"//栈的结构type stack struct{ nums []int}队列的结构...原创 2019-03-15 09:22:44 · 639 阅读 · 0 评论 -
go channel的学习总结
go channelchannel是goland中一种特殊的类型的存在,对于goland的学习来说是非常重要的。channel是goland中goroutine间的通信的一种方式,可以类比成 Unix 中的进程的通信方式管道。并发模型因为goland是一个支持并发的编程语言,而且channel又在并发中起了关键作用,所以我们简单介绍一下并发模型,传统的并发模型主要是Actor和GSP两种,...原创 2019-03-10 09:45:42 · 458 阅读 · 0 评论 -
控制并发-Sync. go
今天学了go的并发,go并发的时候,可能会产生很多个goroutine,过程是不可控的,所以控制并发至关重要,WaitGroup是一种控制并发的方式,控制多个协程同时完成。用一个简单的例子说明一下:package mainimport ( "sync" "time" "fmt")func main(){ var wg sync.WaitGroup /...原创 2019-01-14 17:57:25 · 208 阅读 · 0 评论 -
Go并发控制--channel
虽然上次提过的sync控制并发很简单,但是他有一定的局限性,他也只能控制能过让所有的goroutine在程序结束时完成,并不能干涉各个goroutine,下面我们介绍一种更好的方式,就是利用通道;首先先说用channel控制并发在程序结束之前完成:func main(){ch :=make(chan int)go func() { var sum int =0 for ...原创 2019-01-14 18:33:05 · 425 阅读 · 0 评论 -
深入解析Go语言--基本类型(结构体,指针和字符串)
结构体和指针://定义一个结构体type Point struct{x,y int}简单声明一下:p:=Point{10,20}这时候系统会分配两块内存,分别储存两个数据;这个时候如果你输出一下p,结果就是:{10 20}p:=&Point{10,20}很明显,我们先定义了一个Point类型并且赋值,然后取了地址赋给p,所以这个时候,p储存的就是一个地址...原创 2019-01-20 10:38:14 · 808 阅读 · 0 评论 -
深入解析Go语言--(二)切片slice
我们都知道Go中slice切片是不同于数组的数据类型,他的亮点在在于它是引用类型,那么它是如何实现引用的呢?首先我们先来明确一下他的结构,一个slice是包含 3个域的结构体,分别是:指向slice中的第一个元素的指针,slice的长度,以及slice的容量。区分一下长度和容量,长度是下表操作的上界,如x[i]中的i必须小于长度;容量是分割操作的上界,如x[i:j]中j不能大于容量。定义一...原创 2019-01-20 13:02:25 · 325 阅读 · 0 评论 -
Go编程基础-反射 reflection
首先来了解一下使用反射的好处:-- 反射可大大提高程序的灵活性,使得interface{}有更大的发挥余地--反射使用TypeOf()和ValueOf(函数从接口中获取目标对象的信息)-- 反射会将匿名字段作为独立字段(匿名字段本质)--想要利用反射修改对象的状态,前提是interface.data是settable,即pointer-interface--通过反射可以动态地调...原创 2019-01-16 20:18:35 · 193 阅读 · 1 评论 -
深入解析Go语言(三)--goroutine
很多人都是冲着GO的高并发来学习Go的,今天我们来解析一下首先我们先明确两个概念:并发和并行并发:一个CPU能同时执行多项任务,在很短的时间内,CPU来回切换执行任务,宏观上是同时的,微观上其实还是顺序执行,因为时间差太小,所以看起来就是多个任务同时执行,这就是并发并行:当系统有多个cpu时,每个cpu同一时刻都运行任务,互不抢占自己所在的资源,同时进行,这就是并行明确一下:并行不...原创 2019-01-22 18:49:52 · 377 阅读 · 0 评论 -
go--双链表的实现(增删改查)
前些时间写了关于单链表的的基本实现,这些天看到一些关于双链表的问题,就决定再写一篇关于双链表的基本操作,其实与单链表的实现没有本质上的区别,只是增加了一个前继指针,下面看一下具体实现;package mainimport ( "fmt")type Node struct { //节点的定义 data int Pro *Node Next ...原创 2019-02-06 09:41:38 · 360 阅读 · 0 评论 -
深入理解go语言切片在函数传递中的用法
首先我先说明一下写这篇博客的原因,之前刷题的时候,有一道题,本想用回溯递归来解决,因为我最近都用go刷题,就出现了一些我没想到的问题,之前我一直以为将切片弹出最后一个元素,就是靠res=res[:len(res)]实现的,而且之前在某些时候用的时候确实起效,但是我却忽略了一个非常重要的事情,那就是切片的性质,即使你对res进行了不包括的最后一个元素的赋值,但是归根结底没有对他所指向的底层数组进行改...原创 2019-03-09 11:18:23 · 4138 阅读 · 3 评论 -
go语言实现二叉树的基本操作
package mainimport "fmt"type TreeNode struct { data interface{} Lchild *TreeNode Rchild *TreeNode}func CreatTree() *TreeNode{ nums:=0 fmt.Scan(&amp;nums) if nums==0{ return nil } root:...原创 2019-03-09 12:39:47 · 628 阅读 · 0 评论 -
go语言--strings包常用函数
这篇主要介绍一下strings包中常用的一些函数,没有什么个人观点,主要作为个人总结记录子串判断是否存在某个字串或字符//若子串subxtr在s中,返回truefunc Contains(s,substr string) bool//chars中任何一个Unicode代码点在s中,返回truefunc ContainsAny(s,chars string) bool//Unicode...原创 2019-03-31 13:04:44 · 555 阅读 · 0 评论