自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 Golang回文数变换代价

题目来源 360春招2021编程题所谓回文数就是一个数字,从左边读和从右边读的结果都是一样的,例如12321。现在有一个只包含1、2、3、4的数字,你可以通过在任意位置增加一位数字或者删除一位数字来将其变换成一个回文数。但是增加或删除不同数字所需要的代价是不一样的。已知增加和删除每个数字的代价如下:增加一个1,代价:100;删除一个1,代价:120。增加一个2,代价:200;删除一个2,代价:350。增加一个3,代价:360;删除一个3,代价:200。增加一个4,代价:220;删除一个4,代价

2021-05-24 14:48:24 786 3

原创 Golang实现宝藏最高价值问题(动态规划)

题目来源 360春招笔试题2021年X星人发现了一个藏宝图,在藏宝图中标注了N个宝库的位置。这N个宝库连成了一条直线,每个宝库都有若干枚金币。X星人决定乘坐热气球去收集金币,热气球每次最多只能飞行M千米(假设热气球在飞行过程中并不会发生故障)此外,由于设计上的缺陷,热气球最多只能启动K次。X星人带着热气球来到了第1个宝库(达到第1个宝库时热气球尚未启动),收集完第1个宝库的金币后将启动热气球前往下一个宝库。如果他决定收集某一个宝库的金币,必须停下热气球,收集完之后再重新启动热气球。当然,X星人每到一

2021-05-23 22:33:32 434

原创 Golang的类型断言详解

第二种第三种第四种

2021-05-20 16:04:40 178

原创 Golang的panic和recover

函数遇见了panic后就不会继续执行后面的函数,而是开始按顺序执行defer,在defer执行函数的时候,会判断自己这个函数会不会因为panic引起新的panic,如果会的话就把新panic加入到panic链表的头部。加入到头部以后继续执行defer函数,如果defer函数里的panic不是头部的panic,就往下找到那个然后终止掉。意思就是旧的panic已经引起了新的,所以旧的可以终止掉当defer执行完之后,按照从后往前的顺序也就是panic发生的先后顺序打印panic信息。panic的结构

2021-05-20 15:19:15 280

原创 Golang的defer详解

defer结构defer的调用过程deferproc函数在调用时会在它自己的两个参数后边开辟一段空间,存放defer函数的参数和返回值。这一段空间会被直接拷贝到defer结构体的后面。deferproc函数执行时会在堆上分配一段空间,用于存放defer结构体,以及函数的大小和返回值defer的函数为闭包函数的情况闭包函数捕获的变量放在堆上,栈里存放变量的地址如果找到捕获变量通过寄存器存储的funcvalue地址,加上偏移量找到捕获变量A的地址最后如果defer的函数里还有参数,是先执行里

2021-05-20 14:20:51 272

原创 Golang方法的调用栈以及值和指针的区别

传值的方法调用栈传指针的方法调用栈语法糖编译的时候会自动改变类型如果把函数赋给一个变量或者把方法赋给一个变量再或者把一个闭包赋给一个变量实质上都是通过二级指针先建立一个指针指向函数地址,然后再指向这个指针,每一个变量都会有一个属于自己的指针。指针里存有捕获变量和函数的地址。...

2021-05-20 13:54:09 117

原创 Golang函数调用栈

分配给函数的栈空间称为栈帧栈底称为栈基栈顶称为栈指针

2021-05-20 13:42:40 241

原创 C++搭配PCL在点云里画直线的实现

一个很简单的小功能在点云里画自己给定点之间的连线我这里实现的是把二维的点云用一个正方体围起来,并等分为n*n个格子代码例子如下所示//我这里的是三维的点云,然后将z坐标置0了//定义四个边界点,水平的最大最小,竖直的最大最小float boundaryleft, boundaryright, boundaryup, boundarydown; boundarydown = 0; boundaryleft = 0; boundaryright = 0; boundaryup = 0;

2021-05-19 18:50:01 2239 6

原创 Golang实现七星不靠中国麻将能否胡牌算法

题目来源网易互娱2021笔试题七星不靠是中国麻将竞赛规则的番种,胡牌时由东南西北中发白7张,外加其他花色的147、258、369不相连的牌型,且没有将牌而组成。七星不靠中的七星是指:东西南北中发白,也就是牌中必须有这七张。而其它牌按下述的来拼全:东西南北中发白+147万+258饼+369条东西南北中发白+147万+258条+369饼东西南北中发白+147条+258万+369饼东西南北中发白+147条+258饼+369万东西南北中发白+147饼+258条+369万东西南北中发白+147饼+25

2021-05-19 18:33:04 681

转载 Golang实现查看程序块运行时间

函数的运行时间的长短是衡量这个函数性能的重要指标,特别是在对比和基准测试中,要得到函数的运行时间,最简单的办法就是在函数执行之前设置一个起始时间,并在函数运行结束时获取从起始时间到现在的时间间隔,这个时间间隔就是函数的运行时间。在Go语言中我们可以使用 time 包中的 Since() 函数来获取函数的运行时间,Go语言官方文档中对 Since() 函数的介绍是这样的。func Since(t Time) DurationSince() 函数返回从 t 到现在经过的时间,等价于time.Now().

2021-05-19 18:24:50 625

原创 Golang实现LRU缓存

什么是LRULRU是Least Recently Used的缩写,即最近最少使用。实际生活中应用非常广,例如所有手机的后台应用。在打开后台应用时,最前显示的一定是最近使用的,包括最新打开的,或者打开之前的;超过后台限制时则将最老的程序关掉。即设置一个队列,有两个操作,新建和使用。新建时,将新输入的元素放入队列头部,使用时,将使用的队列里的元素,从队列中取出,并放到队列头部当队列元素达到上限时,删除队尾元素。package mainfunc main() {}type LRUCac

2021-05-18 20:29:23 479

原创 合格程序猿需要掌握的专业缩写词

1.RT(Respose Time) 响应时间 指系统对请求作出响应的时间。2.(Throughput)吞吐量是指系统在单位时间内处理请求的数量。3.QPS(Query Per Second) 每秒查询率是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准4.API(Application Programming Interface)又称为应用编程接口,就是软件系统不同组成部分衔接的约定。由于近年来软件的规模日益庞大,常常需要把复杂的系统划分成小的组成部分,编程接口的设计十分重要。程序设计的实

2021-05-18 20:21:37 164

原创 Golang实现不确定长度的输入

package mainimport ( "bufio" "fmt" "os" "strings")func main() { inputReader := bufio.NewReader(os.Stdin) // 返回一个读取器实例Reader input, _ := inputReader.ReadString('\n') // 按照分隔符读取内容 strs := strings.Fields(input) // 按照空格分割字符串,返回字符串切片 fmt

2021-05-18 20:19:59 674

原创 Golang里make和new的区别

返回值new返回的是地址,make返回的是对象本身参数new 可以针对任何类型make 针对map slice chanmap时添加类型slice时添加类型,添加len长度,cap容量可选chan时添加类型,容量可选,缺省是为无缓冲区的chan作用场景make 在初始化slice map 和chan时经常用到尤其是slice 时 需要初始化容量而其他情况下一般采用:=直接声明并初始化一个变量,而不采用new的方式...

2021-05-18 20:17:32 122

原创 Golang里的Slice的一点细节和扩容规则

Slice是什么Slice中文名切片,简单的可以理解为可以变化的数组,Slice的底层指向为一个数组,Slice由三部分组成data 存什么 Len存了多少,长度 cap 能存多少,底层数组的长度不同的切片指向同一个数组时,修改数组或者任意一个切片的内容,其他共用到这个修改内容的元素都会被影响到。append可以往切片里添加元素,当添加的元素不超过cap的长度时,指向的底层数组还是原来那个,修改就会影响别的;一旦超过了cap长度,就会引发扩容,扩容后会指向一个新的底层数组,此时扩容后的切片

2021-05-18 19:57:41 376

原创 vscode安装配置Go的下载工具失败

除去别的博客自己git get然后安装巴拉巴拉巴拉的可以试试修改代理为https://goproxy.cn,https://gocenter.io,https://goproxy.io,direct

2021-05-18 19:45:08 199

原创 内存对齐的一些内容

为什么要内存对齐计算机的实际内存的地址并不是连续的,而是分开的。每读取一次,可以获得8个地址,如果不进行内存对齐,读取跨越边界的数据时就要浪费一次读取的时间。CPU想要读取数据就需要通过地址总线把地址传输给内存,内存通过数据总线把数据交给内存。地址总线有几根就可以表示多少位的地址,8根就是256个地址,32根就可以表示4GB个地址。想要数据传输的快,就要加宽数据总线,一字节是8位,想操作4字节就要32根数据总线,8字节就需要64根数据总线,32,64就是所谓的机器字长。类型大小和平台最大对其边

2021-05-18 19:42:40 75

原创 Golang里的Mutex互斥锁

Mutex的结构为一个结构体,只有两个变量type Mutex struct{ state int32 sema uint32}state 用来标置锁,为1代表获得锁,为0代表解锁sema是一个信号量,用作等待队列Mutex分为两种模式正常模式一个尝试加锁的goroutinue如果获得锁失败,就会通过原子操作自旋尝试加锁,自旋可以让程序获得更高的吞吐量,因为频繁的挂起和唤醒goroutinue会带来较多的开销,但是又不能无限制的自旋,因此要加入等待队列。如果goroutinue自旋几次

2021-05-18 19:31:38 141

转载 什么是内核态和用户态

计算机的组成计算机由运算器,控制器,存储器和输入设备,输出设备组成。其中,运算器是无状态的;控制器配合一部分寄存器,但是寄存器数量很少,而且通常都很容易被修改;输入设备、输出设备只有接受指令的时候才动作。归根结底来说,整个计算机的运行状态几乎完全由存储器和少数几个寄存器控制。也就是说,如果一段程序能够完全控制物理内存,那么它就能做到任意改变计算机的状态。在一开始的DOS系统上,就可以将要执行的应用程序加载变成了操作系统的一部分,然后混合起来运行,哪一段是用户程序、哪一段是操作系统并没有很明确的界限:用

2021-05-18 16:23:20 6934

原创 Golang递增子序列系列问题

一共包括三个子问题实现语言问golang,在二分法中用到了sort包里的SearchInts最长连续递增子序列func continuouslengthOfLIS(nums []int) int { //最长的连续递增子序列长度 ans, left := 1, 0 for i := 1; i < len(nums); i++ { if nums[i] <= nums[i-1] { ans = max(ans, i-left) left = i } } ans

2021-05-18 15:35:19 230

原创 IO多路复用之select,poll,epoll

背景通过操作系统记录的进程控制信息可以找到打开文件描述符表,里面包含着进程打开的文件、创建的socket等。socket的所有操作都需要由操作系统的系统调用来完成。每创建一个socket,就会在文件描述符表中增加一条记录,返回给应用程序的只有一个socket描述符,用于识别不同的socket。每个TCP socket创建时,操作系统都会为其分配一个读缓冲区和写缓冲区,要获得响应数据就需要从读内核空间的读缓冲区拷贝到用户空间,同样想发送数据时,需要把用户空间的数据拷贝到写缓冲区,然后再发送给服务器。

2021-05-17 21:52:12 122

原创 上下文和什么时候切换上下文

什么是上下文当一个进程在执行时,CPU的所有寄存器中的值、程序计数器、栈指针等被称为该进程的上下文。当内核需要切换到另一个进程时,它需要保存当前进程的所有状态,即保存当前进程的上下文,以便在再次执行该进程时,能够必得到切换时的状态执行下去。什么时候要切换上下文一,为了保证所有进程可以得到公平调度,CPU 时间被划分为一段段的时间片,这些时间片再被轮流分配给各个进程。这样,当某个进程的时间片耗尽了,就会被系统挂起,切换到其它正在等待 CPU 的进程运行。二,进程在系统资源不足(比如内存不足)时,要等到

2021-05-17 17:21:43 192

原创 Go里的协程是什么?

协程的关键思想在于控制流的让出和恢复每个协程有自己的执行栈,可以保存自己的执行现场。可以由用户程序按需创建协程,协程主动让出执行权时,会保存执行现场然后切换到其他协程;协程恢复执行时,会根据之前保存的执行现场,继续执行中断前的任务。这样就实现了既轻量又灵活的由用户态进行调度的多任务模型。因为用户程序不能操作内核空间,所以只能给协程分配用户栈,而操作系统对此一无所知,所以协程又被称为“用户态线程”。...

2021-05-17 16:57:40 147

原创 同步和锁的本质

同步在并发场景下,可能出现安全问题。比如在去银行取钱,账户里有500余额,进程A要取200块钱,进程B也要取200块钱。一般流程是,第一步把余额500存入寄存器,第二步在寄存器里减去200变成300,第三步把300写进余额。但是可能在运行了第一步之后在第三步之前,时间片用完,进程从A切换到B,进程B去读取余额也是500,然后放到寄存器里,再减去200,最后将300写入余额。然后进程B结束,进程A恢复,继续执行第三步把300写进余额。但是进程A和进程B都取了200,此时账户的余额为300,而不是10

2021-05-17 15:49:18 119

原创 进程和线程的区别,为什么线程切换代价小?

什么是进程一个程序一般对应一个进程,每个程序在执行过程中肯定要获得一些资源,一块属于自己的地盘,因此系统就把这些东西划分出来给一个进程,这个程序的所有操作都在进程里完成。进程就相当于一个工厂,不仅有自己的厂房,所需要的物料、机器以及工人和产品等。因此进程是操作系统进行资源分配和调度的一个基本单位。什么是线程一个进程最少有一个线程,线程可以实现把进程所需要执行的工作再次细分的能力。上面把进程比喻成一个工厂,那么线程就是工厂里的一条流水线,多个线程就是多个流水线,这些流水线相互之间独立,拥有自己加工的数

2021-05-17 15:05:01 2753

原创 浅谈虚拟内存是什么

本内容参考于幼麟实验室,知乎,B站都有虚拟内存顾名思义,不是真实的内存。要了解虚拟内存,必须也要了解真实的物理内存地址是怎样的。虚拟内存就是在不同的进程中都使用相同的线性地址,就如同在一个学校里不同教师都有第一排,第二排,而不能统一编号第一到第N排,否则对每个教室来说管理起来会非常混乱。物理地址中每4KB作为一页,以页为单位映射。操作系统以链表的形式记录各个进程的控制信息,进程控制块PCB,进程控制块中存在一个指针,存储的是当前进程“页目录”的物理地址,页目录也是一个内存页,存储一系列指向页表的指针,

2021-05-17 14:44:09 396

8.《代码随想录》回溯算法(V3.0).pdf

8.《代码随想录》回溯算法(V3.0).pdf

2024-07-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除