内容简介:[TOC]发现自己的算法能力太差了,打算从最基础的数据结构学习算法,将自己的基础给打扎实,实现一个单项循环队列
ARTS 第11周分享
[TOC]
Algorithm
发现自己的算法能力太差了,打算从最基础的数据结构学习算法,将自己的基础给打扎实,
实现一个单项循环队列
[思路]
- 一个队列包含有前节点,指向第一个元素;尾节点,指向最后一个元素;最大尺寸,记录能够存储的最大元素数量;以及一个数组用来存储实际的数据(在golang中更适合用slice实现)
- 初始头和尾指针都指向下标为0的元素
-
通过预留一个空位来区别空队列与满队列,否则将很难区分二者
- 空:rear = front
- 满:(rear+1+ maxSize - front)% maxSize == 0
[参考代码]
type singleCircleArray struct { maxSize int front int rear int myArray []int } func (s *singleCircleArray) addItem(item int) (err error) { if s.isFull() { fmt.Print("full Array/t") return errors.New("full Array") } s.myArray[s.rear] = item fmt.Println("addItem: ", s.myArray) s.rear = (s.rear + 1) % s.maxSize return } func (s *singleCircleArray) isFull() bool { return (s.rear+1-s.front+s.maxSize)%s.maxSize == 0 } func (s *singleCircleArray) isNull() bool { return s.rear == s.front } func (s *singleCircleArray) getItem() (item int, err error) { if s.isNull() { return 0, errors.New("empty Array") } item = s.myArray[s.front] s.myArray[s.front] = 0 s.front = (s.front + 1) % s.maxSize return } func (s *singleCircleArray) head() (item int, err error) { if s.isNull() { return 0, errors.New("empty Array") } fmt.Println(s.myArray[s.front]) return s.myArray[s.front], err } func (s *singleCircleArray) list() { if s.isNull() { fmt.Println("empty Array") return } temp := s.front for { fmt.Printf("%d\t", s.myArray[temp]) temp = (temp + 1) % s.maxSize if s.rear == temp { break } } }
Review
-
golang里的pointer: https://golangbot.com/pointers/
- 指针是一个变量,存储的是变量的地址
- 通过 *T 声明一个指针
- 指针的零值是nil
- 通过new()函数初始化一个指针
- 通过 &t 来获取一个指针指向的值
- 在函数的参数上,不要将声明为一个数组的指针;如果需要修改数组,可以函数的参数定义为一个切片,通过将Array[:]作为参数传递
- golang指针不支持运算
Tips
git diff 的常用用法
-
git diff
- 什么都不加就是对比: 工作区与暂存区
-
git diff --cached
- 暂存区与最新的本地版本库(本地最新一次commit的内容)
-
git diff head
- 工作区 与 最新的本地版本库
-
git diff + 指定版本id(commit_id)
- 工作区 与 指定的提交版本
-
git diff --cached + 指定版本id(commit_id)
- 暂存区与 指定的提交版本
-
git diif commit_id commit_id
- 比较两个版本之间的差异
share
Go语言实战笔记(十八)| Go log 日志: https://www.flysnow.org/2017/05/06/go-in-action-go-log.html
-
golang 提供了log包,来追踪日志的记录
-
- 与fmt包很相似,但是输出默认带时间戳
-
log包提供了可定制化的日志抬头信息
-
-
通过log.SetFlags 进行设置
-
可定义的常量选项
-
const ( Ldate = 1 << iota //日期示例: 2009/01/23 Ltime //时间示例: 01:23:23 Lmicroseconds //毫秒示例: 01:23:23.123123. Llongfile //绝对路径和行号: /a/b/c/d.go:23 Lshortfile //文件和行号: d.go:23. LUTC //日期时间转为0时区的 LstdFlags = Ldate | Ltime //Go提供的标准抬头信息 )
-
-
- 设置了Lmicroseconds,那么Ltime就不生效了;设置了Lshortfile, Llongfile也不会生效
- LUTC比较特殊,如果我们配置了时间标签,那么如果设置了LUTC的话,就会把输出的日期时间转为0时区的日期时间显示。对我们东八区的时间来说,就会减去8个小时。
- LstdFlags表示标准的日志抬头信息,也就是默认的,包含日期和具体时间。(也就是不用设置,就是这个格式)
-
通过log.SetPrefix可以指定输出日志的前缀
-
-
在log包除了有Print系列的函数,还有Fatal以及Panic系列的函数。
-
- Fatal表示程序遇到了致命的错误,记录完日志然后退出。Fatal相当于先调用print打印日志,然后调用os.Exit(1) 退出程序。
- Panic函数先使用Print记录日志,然后调用Panic() 抛出一个恐慌(可以选择性的用recover() 恢复程序)
-
实现原理: 关键的输出日志就在于std.Output方法。
-
-
输出目的地:
-
- os.Stderr对应的是UNIX里的标准错误警告信息的输出设备,同时被作为默认的日志输出目的地。除此之外,还有标准输出设备os.Stdout,以及标准输入设备os.Stdin。
- var ( Stdin = NewFile(uintptr(syscall.Stdin), "/dev/stdin") Stdout = NewFile(uintptr(syscall.Stdout), "/dev/stdout") Stderr = NewFile(uintptr(syscall.Stderr), "/dev/stderr") )
- 以上就是定义的UNIX的标准的三种设备,分别用于输入、输出和警告错误信息。
-
在log包的SetOutput函数,可以设置输出目的地。
-
通过runtime.Caller,可以获取运行时方法的调用信息
-
- func Caller(skip int) (pc uintptr, file string, line int, ok bool)
- 参数skip表示跳过栈帧数,0表示不跳过,也就是runtime.Caller的调用者。1的话就是再向上一层,表示调用者的调用者。
- log日志包里使用的是2,也就是表示我们在源代码中调用log.Print、log.Fatal和log.Panic这些函数的调用者。
-
第二周:1, 2, 3, 4, 5, 6, 7 为什么计算机只认识0和1?https://mp.weixin.qq.com/s/9ePjft6QleS8pRz9AoXlmA 罗胖60秒:什么是最好的时间管理?https://mp.weixin.qq.com/s/o7fn1-ITovRHMyGUcWohoA 沉浸在你尊重的事儿里面,比如读书,健身, 学习。 Go2错误处理提案:try还是check?https://mp.weixin.qq.com/s/fpTM4zXCmGe2c03LhNbFRw 时区的关系:https://mp.weixin.qq.com/s/sgtPyXJxs5-Rh5OorFz8bw 由于地球自转,导致不同经度的地方时间有不同,即东边比西边早看到太阳 时区:地球表面按经度:自东向西划成一个个区域,并且规定每个区域相差一个小时 跨时区时,向东加1小时,向西减1小时 中国时间:GMT + 8 (也就是所谓的东八区) GMT: Greenwich Mean Time 格林威治时间,英国xxx天文台平太阳时间为0点 罗胖60秒:为什么“目的性强”的人招人讨厌?https://mp.weixin.qq.com/s/_m2bQVgTVSLN8dhxuT0MEw 讨厌的原因不是目的性强,而是目标太狭窄 比如挣钱,如果还有一个原因,哪怕是为了让孩子上更好的大学,就不会觉得你目的性强 生存策略:把自己多层次的,丰富的目标主动暴露出来给别人看 刘润:如何赢得一场辩论?https://mp.weixin.qq.com/s/TPIU40vRXOzx5061AcH6lQ // good Go之父说:不懂浮点数不配当码农…https://mp.weixin.qq.com/s/0lCte3UD5qYcaBnebwnYrQ 不懂这12个语法糖,别说你会Java!https://mp.weixin.qq.com/s/wIQAXFe208n0OVlX4tbKzg 高性能 Go 服务的内存优化(译):https://mp.weixin.qq.com/s/kfcuG1gbQLBY8HsAC92P9g Git diff 常见用法: https://www.cnblogs.com/qianqiannian/p/6010219.html Go 语言日志指南: https://linux.cn/article-8543-1.html Go语言实战笔记(十八)| Go log 日志: https://www.flysnow.org/2017/05/06/go-in-action-go-log.html Golang 优化之路——自己造一个日志轮子: https://blog.cyeam.com/golang/2017/07/14/go-log Golang struct、interface 类型详解: https://www.jianshu.com/p/d87c69ac6ce7 golang的struct里面嵌入interface: https://www.jianshu.com/p/a5bc8add7c6e 字符串匹配的KMP算法: https://mp.weixin.qq.com/s/JeKZGc7MzSaaEl3nehi0pg https://golangbot.com/pointers/
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
具体数学(英文版第2版)
[美] Ronald L. Graham、Donald E. Knuth、Oren Patashnik / 机械工业出版社 / 2002-8 / 49.00元
This book introduces the mathematics that supports advanced computer Programming and the analysis of algorithms. The primary aim of its well-known authors is to provide a solid and relevant base of ma......一起来看看 《具体数学(英文版第2版)》 这本书的介绍吧!