Go语言中文网 为您找到相关结果 34

golang中defer的执行

golang中defer的执行 大家都知道golang的defer关键字,它可以在函数返回前执行一些操作,最常用的就是打开一个资源(例如一个文件、数据库连接等)时就用defer延迟关闭改资源,以免引起内存泄漏。例如: func do() (ok bool) { file,_ := os.Open("c:\a.txt") defer file.Close() // doSomething return ok } 我们可以在官方的文档中看到defer的执行顺序是逆序的,也就是先进后出的顺序: for i := 0; i < 5; i++ { defer fmt.Printf("%d ", i) } 打印结果是:4,3,2,1,0 那么再看这个例子: func deferRet(x,y int) ...阅读全文

博文 2014-10-04 19:26:10 wowzai

go语言的排序和搜索

晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题。排序 sort 是个基本的操作,当然搜索 search 也是。c 提供一个 qsort 和 bsearch,一个快排一个二分查找,不过是使用起来都不方便; c++ 中的 sort 貌似很不错,因为 c++ 支持泛型(或是说模板),所以很多东西使用起来很方便。go 是通过 sort 包提供排序和搜索,因为 go 暂时不支持泛型(将来也不好说支不支持),所以,go 的 sort 和 search 使用起来跟类型是有关的,或是需要像 c 一样写比较函数等,稍微显得也不是很方便。 补注: 近来又看 go 的排序, 发现以前对 go 的排序理解的有点浅了。 go 的排序思路和 c 和 c++ 有些差别。 c 默认是对数组进行排序, c+...阅读全文

博文 2014-10-24 11:38:53 陆仁贾

常用位操作技巧(Golang)

1,判断奇偶 for i := 0; i < 100; i++ { if i % 2 == 0 { println(i) } if i & 0x1 == 0 { println(i) } } 2,交换两个数 func Swap(a, b *int) { if *a^*b != 0 { temp := *a *a = *b *b = temp } } func Swap(a, b *int) { if *a^*b != 0 { *a = *a + *b *b = *a - *b *a = *a - *b } } func Swap(a, b *int) { if *a^*b != 0 { *a ^= *b *b ^= *a *a ^= *b } } 3,交换符号 func ExcangeSym...阅读全文

博文 2014-11-14 08:00:01 xlplbo

一致性hash算法原理及golang实现

概述 这里存在一种场景, 当一个缓存服务由多个服务器组共同提供时, key应该路由到哪一个服务.这里假如采用最通用的方式key%N(N为服务器数目), 这里乍一看没什么问题, 但是当服务器数目发送增加或减少时, 分配方式则变为key%(N+1)或key%(N-1).这里将会有大量的key失效迁移,如果后端key对应的是有状态的存储数据,那么毫无疑问,这种做法将导致服务器间大量的数据迁移,从而照成服务的不稳定. 为了解决类问题,一致性hash算法应运而生. 1. 一致性hash算法特点 在分布式缓存中, 一个好的hash算法应该要满足以下几个条件: 均衡性(Balance) 均衡性主要指,通过算法分配, 集群中各节点应该要尽可能均衡. 单调性(Monotonicity) 单调性主要指当集群发生...阅读全文

博文 2016-09-10 16:00:01 u010511236

负载均衡--golang实现一致性hash算法

有没有好奇过redis、memcache等是怎么实现集群负载均衡的呢? 其实他们都是通过一致性hash算法实现节点调度的。 讲一致性hash算法前,先简述一下求余hash算法: hash(object)%N 一个缓存服务器宕机了,这样所有映射到这台服务器的对象都会失效,我们需要把属于该服务器中的缓存移除,这时候缓存服务器是 N-1 台,映射公式变成了 hash(object)%(N-1) ; 由于QPS升高,我们需要添加多一台服务器,这时候服务器是 N+1 台,映射公式变成了 hash(object)%(N+1) 。 1 和 2 的改变都会出现所有服务器需要进行数据迁移。 一致性HASH算法 一致性HASH算法的出现有效的解决了上面普通求余算法在节点变动后面临全部缓存失效的问题: type ...阅读全文

博文 2018-08-09 23:34:51 豆瓣奶茶

常用位操作技巧(Golang)

1,判断奇偶 for i := 0; i < 100; i++ { if i % 2 == 0 { println(i) } if i & 0x1 == 0 { println(i) } } 2,交换两个数 func Swap(a, b *int) { if *a^*b != 0 { temp := *a *a = *b *b = temp } } func Swap(a, b *int) { if *a^*b != 0 { *a = *a + *b *b = *a - *b *a = *a - *b } } func Swap(a, b *int) { if *a^*b != 0 { *a ^= *b *b ^= *a *a ^= *b } } 3,交换符号 func ExcangeSym...阅读全文

博文 2014-11-14 14:00:01 seago123

go语言的排序和搜索(转载)

http://studygolang.com/articles/1598 go语言的排序和搜索 晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题。排序 sort 是个基本的操作,当然搜索 search 也是。c 提供一个 qsort 和 bsearch,一个快排一个二分查找,不过是使用起来都不方便; c++ 中的 sort 貌似很不错,因为 c++ 支持泛型(或是说模板),所以很多东西使用起来很方便。go 是通过 sort 包提供排序和搜索,因为 go 暂时不支持泛型(将来也不好说支不支持),所以,go 的 sort 和 search 使用起来跟类型是有关的,或是需要像 c 一样写比较函数等,稍微显得也不是很方便。 补注: 近来又看 go 的排序, 发现以前对 go 的排序理...阅读全文

博文 2016-01-11 03:00:00 basque

【Go语言】基本类型排序和 slice 排序

Go 是通过 sort 包提供排序和搜索,因为 Go 暂时不支持泛型(将来也不好说支不支持),所以,Go 的 sort 和 search 使用起来跟类型是有关的,或是需要像 c 一样写比较函数等,稍微显得也不是很方便。 引言 Go 的排序思路和 C 和 C++ 有些差别。 C 默认是对数组进行排序, C++ 是对一个序列进行排序, Go 则更宽泛一些,待排序的可以是任何对象, 虽然很多情况下是一个 slice (分片, 类似于数组),或是包含 slice 的一个对象。 排序(接口)的三个要素: 待排序元素个数 n ; 第 i 和第 j 个元素的比较函数 cmp ; 第 i 和 第 j 个元素的交换 swap ; 乍一看条件 3 是多余的, c 和 c++ 都不提供 swap 。 c 的 qs...阅读全文

博文 2016-09-22 05:00:02 u010983881

go语言的排序和搜索

晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题。排序 sort 是个基本的操作,当然搜索 search 也是。c 提供一个 qsort 和 bsearch,一个快排一个二分查找,不过是使用起来都不方便; c++ 中的 sort 貌似很不错,因为 c++ 支持泛型(或是说模板),所以很多东西使用起来很方便。go 是通过 sort 包提供排序和搜索,因为 go 暂时不支持泛型(将来也不好说支不支持),所以,go 的 sort 和 search 使用起来跟类型是有关的,或是需要像 c 一样写比较函数等,稍微显得也不是很方便。 补注: 近来又看 go 的排序, 发现以前对 go 的排序理解的有点浅了。 go 的排序思路和 c 和 c++ 有些差别。 c 默认是对数组进行排序, c+...阅读全文

博文 2015-07-27 13:00:01 nop4ss

hdu 5193 Go to movies Ⅱ 块状链表 + 树状数组

数组的定位o(1),插入o(n). 链表的定位o(n),插入o(1). 所以把二者结合,是复杂度均摊为 sqrt(n) 设每块的大小为S,那么删除或者添加元素时,维护逆序对数的复杂度是O(S+\frac{P}{S}* \log n)o(S+(p/s)*logn),S是块内直接暴力更新逆序对的代价,(n/s)∗logn在前面块找比它大和在后面块中找比它小的代价,P表示当前元素的个数。为了使这两部分复杂度尽量均摊让S=\frac{P}{S}* \log nS=(p/s)*logn,S取sqrt(p*logn)。直接通过分块暴力添加和删除时,块的大小会退化,。。。。。(注:原官方题解说重构,不太清楚怎么叫重构。这里为了防止退化,在每个块元素过多时采取分裂操作)。因此整个问题的复杂度为O(m\sqr...阅读全文

博文 2016-07-07 16:00:05 Techmonster

Golang中defer、return、返回值之间执行顺序

写go有一段时间了,虽然也能完成一些api的和一些功能的开发。但是离成为一名真正的Go 开发者还很远。 今天就总结下Go语言中的错误处理吧。对于初学者来说很重要。Go语言中延迟函数defer充当着 try…catch 的重任,使用起来也非常简便,然而在实际应用中,很多gopher并没有真正搞明白defer、return和返回值之间的执行顺序,从而掉进坑中 。 匿名返回值的情况: package main import ( "fmt" ) func main() { fmt.Println("a return:", a()) // 打印结果为 a return: 0 } func a() int { var i int defer func() { i++ fmt.Println("a def...阅读全文

博文 2017-02-10 12:24:01 谢权

用队列求解迷宫最短路径及其应用(围住神经猫)

问题 给定一个M×N的迷宫图,求一条从指定入口到出口的最短路径.假设迷宫图如图所示(M=8, N=8) 对于图中的每个方块,空白表示通道,阴影表示墙。所求路径必须是简单路径,即在求得路径上不能重复出现同一通道块。为了算法方便,在迷宫外围加了一道围墙。对应迷宫数组为: var gameMap = [M + 2][N + 2]int{ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 1, 0, 0, 0, 1, 0, 1}, {1, 0, 0, 0, 0, 1, 1, 0, 0, 1}, {1, 0, 1, 1, 1, 0, 0, 0, 0, 1}, {1, 0, 0, 0, 1, 0, 0, 0...阅读全文

博文 2017-07-29 17:05:06 火蜥蜴

Hdu 5193 Go to movies Ⅱ(带删除数插入数的逆序数对,块状链表)

传送门:Hdu 5193 Go to movies Ⅱ 题意: 有n个人站成一排,每个人的身高为Hi。每次有人加入或者有人离开,就要判断有多少人站反了(i < j&&Hi>Hj) 第一行n,m,接下来n个整数(n,m<=2e4) 接下来m行, 0 x y 表示有一个身高为y的人插在x后面,x=0表示插在最前面。(1≤y≤n) 1 x 表示第x个人(从左到右)离开。 思路:摘自题解http://bestcoder.hdu.edu.cn/solutions.php?page=12 添加或者删除一个元素时,维护逆序对时,需要知道在它之前有多少个数比它大,在它之后有多少个数比他小。有下标和权值两个维度,可以使用两个数据结构嵌套。题目中n=20000,范围不大,外层可以使用分块维护下标,这样添加和删除...阅读全文

博文 2016-09-14 15:00:00 acm_fighting

golang中crypto/hmac包

hmac包实现了U.S.Federal Infomation Processing Standards Publication 198规定的HMAC(加密哈希信息认证码)。 HMAC是使用key标记信息的加密hash。接收者使用相同的key逆运算来认证hash。 出于安全目的,接收者应使用Equal函数比较认证码: 这个包一共提供了两个对外公开的函数: func Equal(mac1, mac2 []byte) bool func New(h func() hash.Hash, key []byte) hash.Hash func Equal(mac1, mac2 []byte) bool 比较两个MAC是否相同,而不会泄露对比时间信息。(以规避时间侧信道攻击;指通过计算比较时花费的时间的长...阅读全文

博文 2018-12-09 14:34:42 laijh

golang实现字符串逆序,不允许临时变量的原地逆序

package main import ( "fmt" ) var ( s1 string ) func main() { fmt.Println(s1) fmt.Println(converString(s1)) } func init() { s1 = "我爱你waylau.com" } func reverseString(s string) string { str := []rune(s) for i, j := 0, len(str)-1; i < j; i, j = i+1, j-1 { str[i], str[j] = str[j], str[i] } return string(str) } 后台输入为 我爱你waylau.com moc.ualyaw你爱...阅读全文

博文 2017-02-10 13:50:49 墨云天

Golang学习笔记之延迟函数(defer)

关键字 defer ⽤于注册延迟调⽤。这些调⽤直到 ret 前才被执⾏,通常⽤于释放资源或错误处理。 一、当defer被声明时,其参数就会被实时解析 func a() { i := 0 defer fmt.Println(i) //输出0,因为i此时就是0 i++ defer fmt.Println(i) //输出1,因为i此时就是1 return } 二、当一个函数内多次调用 defer 时,Go 会把 defer 调用放入到一个栈中,随后按照先进后出的顺序执行。 func main() { defer fmt.Println("1") defer fmt.Println("2") defer fmt.Println("3") defer fmt.Println("4") } 输出顺序为4...阅读全文

博文 2018-12-11 21:34:44 学生黄哲

golang 防知乎 中文验证码 源码

创,转载请注明出处! 最开始用图形来模仿文字进行各种角度的倒立和排列,后来切换为文字后,有很多问题。总结如下: 1、程序在画图形和画文字方面不一样,图形的是从原点开始(0,0),而文字则从文字的基线开始(0,baseline) 2、在增加角度偏移时,文字或图形的高宽会产生变化(偏∠45度时达到最大),这时候为了让它们顶点对齐,需要计算偏移量(用三角函数) 3、在绘图时,会先旋转“画布”(描述可能不准确),再绘制文字。此时要往回旋转,否则下一个图形会顺着这个角度继续画。 4、为了让图形保持固定宽度,对于有偏角的文字,需要平均缩小左右间距(否则不同的角度,固定的文字个数,会让图形宽度不同) 效果图: 源码:(代码还可以再整理和优化,但限于计划时间,懒得弄了) package main impor...阅读全文

博文 2018-07-16 15:30:00 Denny_Yang

golang 手撸 平衡二叉树

golang 手撸 平衡二叉树 树是一种计算机数据结构中非常常用的一种结构,其中就包含了:平衡二叉树,这种树是一种特殊的二叉查找树(二叉查找树也就是,右孩子大于其父结点,左孩子小于其父结点的树),但是简单的二叉查找树存在的问题就是不平衡,最差的查找效率为O(n),故就有人发明了一种平衡的额二叉查找树。 特点 平衡二叉树是一种二叉查找树 每个结点的左子树的高度减去右子树的高度的绝对值不超过1 空树和左右子树都是平衡二叉树 相比红黑树,平衡二叉树比较适用于没有删除的情况 平衡因子 平衡二叉树是在二叉查查找树的基础上进行构建了,为了维持平衡二叉树的平衡,那么就需要一种机制来判断平衡二叉树是否是平衡的。这种机制就叫做平衡因子。 平衡二叉树的每个结点都会维持一个值,这个值就是平衡因子,这个平衡因子就是...阅读全文

博文 2019-07-14 17:32:43 _AlphaBaby_

单向循环链表解决约瑟夫环问题 - Golang 实现

问题描述 编号为 1, 2, … , n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m ,从第一个人开始按顺时针方向自 1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 的值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止。 基本要求 利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 测试数据 7 个人的密码依次为:3, 1, 7, 2, 4, 8, 4 ;m 值为 6 (正确的出列顺序应为 6, 1, 4, 7, 2, 3, 5)。 开始 单个结构体的实现 定义指针和结构体 package main import "fmt" // 定义结构体 typ...阅读全文

博文 2019-09-19 18:32:41 孟显赫

go 学习笔记之解读什么是defer延迟函数

`Go` 语言中有个 `defer` 关键字,常用于实现**延迟函数**来保证关键代码的最终执行,常言道: "未雨绸缪方可有备无患". **延迟函数**就是这么一种机制,无论程序是正常返回还是异常报错,只要存在延迟函数都能保证这部分关键逻辑最终执行,所以用来做些**资源清理**等操作再合适不过了. ![go-error-about-defer.jpg](https://upload-images.jianshu.io/upload_images/16648241-fd49fdabb48f390e.jpeg) ## 出入成双有始有终 日常开发编程中,有些操作总是**成双成对**出现的,有开始就有结束,有打开就要关闭,还有一些**连续依赖**关系等等. 一般来说,我们需要控制结束语句,在**合适...阅读全文

博文 2019-10-18 19:21:25 snowdreams1006

Golang 图片处理(旋转/居中)

简单旋转分为顺时针旋转90度,顺时针旋转180度,顺时针旋转270度。说到底其实就是矩阵旋转,将各个像素点的色值重新赋值 // 旋转90度 func rotate90(m image.Image) image.Image { rotate90 := image.NewRGBA(image.Rect(0, 0, m.Bounds().Dy(), m.Bounds().Dx())) // 矩阵旋转 for x := m.Bounds().Min.Y; x < m.Bounds().Max.Y; x++ { for y := m.Bounds().Max.X - 1; y >= m.Bounds().Min.X; y-- { // 设置像素点 rotate90.Set(m.Bounds().Max...阅读全文

博文 2019-12-28 21:32:42 韬大帅

golang顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. package main import "fmt" func main() { //s := [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}} //s := [][]int{{1}, {2}, {3}, {4}} //s := [][]int{{1, 2, 3, 4}, {5, 6, 7, 8}} s := [][]int{...阅读全文

博文 2019-01-31 12:34:43 ifcoder

两数相加

题目: 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 解题思路: 链表遍历,最后结果返回头 两个链表不一定等长 考虑进位 Java实现 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListN...阅读全文

博文 2019-06-17 14:02:42 杨比轩

链表表示数字相加 go语言版本

链表表示数字相加 go语言版本给定两个非空链表来表示两个非负整数。位数按照逆序方式存储,它们的每个节点只存储单个数字。将两数相加返回一个新的链表。你可以假设除了数字 0 之外,这两个数字都不会以零开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807package main import "fmt" import "strconv" import "reflect" type ListNode struct { data int next *ListNode } //转成字符串,数字 相加,再转成链表 func AddTwoNum(l1 *ListNode, l2 *ListNode) *ListNode ...阅读全文

博文 2019-10-14 22:03:22 雷顿学院

BFS广度优先算法-图

BFS主要解决两个问题 1.从A点出发,查看有没有到达B点的路径? 2.从A点出发,查找到达B的最短路径 有向图BFS用.png DFS深度优先搜索是一条道走到黑其他的道路才能继续走 上图0-1-4,0-2-4,0-3-4的查找方式 BFS广度优先搜索是类似于雷达扫描一样的去查找 上图是0-(1,2,3)-4这种查找方式 BFS的算法原理: 假设我们的查找的起点是0,终点是4 1.首先会创建一个queue把0的邻居点全部入队列 2.用一个循环遍历出队这个队列 3.去检测出队的每个元素的值是不是终点4,如果不是就把出队的这个元素的邻接点再次入队,进入第4步。反之进入第5步 4.重复2、3步骤如果 5.找到终点4就结束了 上面只是原理 通过上面的原理我们可以看到上图的一个流程 1.首先0的邻居 ...阅读全文

博文 2020-01-17 01:32:41 世界之树weight

go 学习笔记之解读什么是defer延迟函数

Go 语言中有个 defer 关键字,常用于实现延迟函数来保证关键代码的最终执行,常言道: "未雨绸缪方可有备无患". 延迟函数就是这么一种机制,无论程序是正常返回还是异常报错,只要存在延迟函数都能保证这部分关键逻辑最终执行,所以用来做些资源清理等操作再合适不过了. 出入成双有始有终 日常开发编程中,有些操作总是成双成对出现的,有开始就有结束,有打开就要关闭,还有一些连续依赖关系等等. 一般来说,我们需要控制结束语句,在合适的位置和时机控制结束语句,手动保证整个程序有始有终,不遗漏清理收尾操作. 最常见的拷贝文件操作大致流程如下: 打开源文件 srcFile, err := os.Open("fib.txt") if err != nil { t.Error(err) return } 复制...阅读全文

博文 2019-10-18 20:34:21 雪之梦技术驿站

golang中的defer recover panic

defer 先看下面代码 func main() { deferCall() fmt.Println("exit main") } func deferCall() { defer fmt.Println("defer 1") defer func() { fmt.Println("defer 2")}() panic("异常") defer func() { fmt.Println("defer 3") if p := recover(); p != nil { fmt.Println("recover", p) } }() time.Sleep(time.Second * 3) fmt.Println("after panic") } 执行结果是: defer 2 defer 1 pan...阅读全文

博文 2019-07-01 17:32:54 无上法门

go 学习笔记之解读什么是defer延迟函数

Go 语言中有个 defer 关键字,常用于实现延迟函数来保证关键代码的最终执行,常言道: "未雨绸缪方可有备无患". 延迟函数就是这么一种机制,无论程序是正常返回还是异常报错,只要存在延迟函数都能保证这部分关键逻辑最终执行,所以用来做些资源清理等操作再合适不过了. 出入成双有始有终 日常开发编程中,有些操作总是成双成对出现的,有开始就有结束,有打开就要关闭,还有一些连续依赖关系等等. 一般来说,我们需要控制结束语句,在合适的位置和时机控制结束语句,手动保证整个程序有始有终,不遗漏清理收尾操作. 最常见的拷贝文件操作大致流程如下: 打开源文件 srcFile, err := os.Open("fib.txt") if err != nil { t.Error(err) return } 创建...阅读全文

博文 2019-10-18 18:02:40 雪之梦技术驿站

golang刷LeetCode[0002] 两数相加

题目 https://github.com/betterfor/leetcode-go/tree/master/algorithms/0002_Two_Add 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 实例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 题解 思路 主要考的是链表这种数据结构的理解,以及链表长度不等时怎么合并链表问题。 /** * Definition for sing...阅读全文

博文 2020-01-01 02:32:55 风云风雨

2019-08-22【LeekCode题库problem-2】

GitHub 地址:coffeeTu-code LeekCode 地址:题库 Language:Golang /* @题目 给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0 之外,这两个数都不会以 0 开头。 @示例: 输入:(2 -> 4 -> 3) + (5 -> 6 -> 4) 输出:7 -> 0 -> 8 原因:342 + 465 = 807 @题目大意 2 个逆序的链表,要求从低位开始相加,得出结果也逆序输出,返回值是逆序结果链表的头结点。 @解题思路 需要注意的是各种进位问题。 极端情况,例如 Input...阅读全文

博文 2019-08-23 04:32:48 CoffeeRabbit

按顺时针打印矩阵

存在二种解题思路: 一种是递归解法,一种是层层递进解法 图解递归解法 如图所示, 一个5*5的矩阵 先打印最外层的圈, 然后剩余最里层3*3的矩阵, 如图. 将3*3的矩阵继续打印最外层,思路与打印最外层思路一样,我们就可以考虑使用递归实现. 最后只剩余一个元素,也可以看成一个矩阵,不过不同大小的矩阵会出现不同形状的矩阵.共3种情况, 如下图. 如图所示, 共三种情况 一个方向的情况 三个方向的情况 四个方向的情况 代码实现思路 矩阵用代码表示为二维数据 首先遍历第一行所有的元素,即图中的从左到右箭头的数据. 然后遍历最右边的元素,即最后一列数据.即图中的从上到下箭头的数据. 再遍历最后一行元素,即图中从右到左箭头的数据 最后遍历最左列的元素,即图中从下到上箭头的数据. 将剩余的矩阵构建成一...阅读全文

博文 2019-12-17 14:32:45 百里

01背包问题

01背包问题 有N件物品和一个容量为V的背包,每个物品只能使用一次, 第i件物品的体积时Vi,价值为wi 求解将哪些物品装入背包,可使物品的总体积不超过背包的容量,且总价值最大,并输出最大值。 第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。 接下来有 N 行,每行两个整数 wi,vi,用空格隔开,分别表示第 i 件物品的体积和价值 题目思路 这是一道经典的算法设计,解题之前,我们不妨先看个实际场景,一个小偷准备去某个大户人家偷东西,小偷带了一个包,该包的最大容积为5体积,该大户人家中物品的体积和价值如下: 体积 价值 1 2 2 4 3 4 4 5 问该小偷应该怎么选择物品,才能获得最大的物品价值? 按照小偷的思路,小偷面对一个物品的时候只有两种选择,放进包中或者不放进包中...阅读全文

博文 2020-01-05 13:32:43 陌无崖

leetcode_1184

Golang: 思路:这题属于简单题,简单题的意义就是比谁的方法效率更高。这道题里,distance数组是一定会被访问一整遍的,那么如何只用一次遍历就得到结果呢?简单的说,当我们找到点i和点j顺时针方向的距离后,那么数组中剩下的数总和就是点i到点j逆时针方向的距离之和了。我们从这两个和里面返回小的那个即可。 代码如下: func distanceBetweenBusStops(distance []int, start int, destination int) int { if start==destination { return 0 } length1,length2:=0,0 if start>destination{ start,destination=destination,st...阅读全文

博文 2020-02-14 00:32:54 淳属虚构

顺时针打印矩阵

题目描述 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10. 示例1: 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,3,6,9,8,7,4,5] 思路 1.这道题比较麻烦的就是边界值的界定,我们可以设置四个点的坐标来标识左上、左下、右上以及右下的位置。 2.我们可以通过二维数组的长和宽相乘获得数组内元素的个数,若数组内的元素没被遍历完成,就一直按照 左上-->右上,右上-->右下,右下-->左下,左下-->左上...阅读全文

博文 2020-01-13 13:32:44 youzhihua