- 博客(22)
- 资源 (1)
- 收藏
- 关注
原创 golang实现自旋锁
import ( "runtime" "sync" "sync/atomic")type spinLock uint32var maxBackoff = 64// Lock 加锁func (sl *spinLock)Lock(){ backoff := 1 for{ for i := 0; i < backoff; i++{ if !atomic.CompareAndSwapUint32((*uint32)(sl),0,1){ //加锁失败,让出cpu调度
2021-10-21 16:36:56 990 1
原创 golang实现雪花算法
package snowflakeimport ( "fmt" "sync" "time")type Snowflake struct { sync.Mutex TimeStamp int64 WorkerID int64 DataCentrail int64 Sequence int64 Mtl int64}const ( // 起始时间戳 epoch = int64(1609430400000) // 时间戳所占的位数
2021-09-23 11:00:12 557
原创 算法学习:缺失的第一个正数
题目描述 给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。golang代码实现: func firstMissingPositive(nums []int) int { if len(nums) == 0{ return 1 } lens := len(nums) for i := 0; i <lens; i++{ if nums[
2021-07-30 12:11:57 280
原创 算法入门: 链表中倒数第k个节点
题目描述: 输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是 倒数第1个节点。 例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。 这个链表的倒数第 3 个节点是值为 4 的节点。题目分析: 1、链表的倒数K个节点,这点逼迫我们遍历链表, 2、K个节点需要计数。 综合两个要求及给相应的解决方法。 采用类似快慢指针的方法,前边遍历时认为当前的节点为最后一个节点,那么倒数第K个节点,就是慢指针所在,当满足快
2021-07-07 15:18:23 197
原创 算法入门: 二叉树最近公共祖先
题目: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。注意如果节点p为另一个节点q的子节点。那么最近 公共父节点为q。题目分析: 1、找 p、q两个节点,可采用深度优先或者广度优先 2、找公共父节点。采用深度优先。 找联系 1)p,q 和公共父节点都可采用深度优先。因此遍历策略采用深度优先。 2)因为公共父节点遍历左右子分支一定能找到 p,q。因此寻找时,先假设某一节点为公共 父节点。找到返回,没有找到回退上一层继续找。 代码实现/** * Defi
2021-07-06 20:09:50 251
原创 算法入门:股票最大收益
题目:给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0直接上代码:type opportunity struct{ price int //记录价格 diff int //记录差值}func maxProfit(prices []in
2021-07-05 22:09:53 537
原创 算法入门: 两数之和
题目: 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那两个整数, 并返回它们的数组下标。题目分析: 数组中找到两个数相加的值为指定的某个值。这两个数一定为一对。解题:解法1:使用暴力的方法,target减去数组中的整数,然后与其他整数去判断。这样就是一个双层循环。第一层循环target-nums[i]得到值X,然后第二层去循环数组寻找等于X的下表。第一层时间复杂度N,第二层时间复杂度N,两者具有关联最终时间复杂度:N^2
2021-07-05 20:58:32 157
原创 翻转一棵二叉树
示例:输入: 4/ 2 7/ \ / 1 3 6 9输出: 4/ 7 2/ \ / 9 6 3 1对于树,一般可采用深度优先和广度优先。本文解法深度优先得递归解法。递归解法的四大招:1、递归终止条件;2、处理当前层逻辑;3、下沉到下一层;4、处理当前层剩余逻辑。那么此题:第一招:终止条件,只有当节点为空我们停止递归 ------> root == nil{ return root};第二招:处理当前层逻辑,
2021-06-07 21:00:34 135
原创 算法入门:搜索二维矩阵
题目:搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。问题分析: 每行从左到右升序,每列从上到下升序,即每行都是有序的。依据此特性我们判断行首大于target,行尾小于target 为判断条件,满足此条件的行进行二分查找。伪代码1、判断是否为空2、for 循环每一行 判断matrix[i][0] < target && matrix[i][
2021-04-13 20:13:25 166
原创 算法入门:给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。
问题分析:关键字:找出 出现次数大于[n/2]的数问题解决:出现次数大于[n/2],这种数字只会出现一次,提供一种最简单的解题思路,两层for循环进行对比得到一个数据出现次数大于[n/2]立刻返回。func majorityElement(nums []int) int { len := len(nums) for i := 0; i < len; i++ { tmp := 0 //统计出现的次数 for j := i; j < len; j++ { // i之前的不用
2021-04-12 21:37:05 2086
原创 算法入门 :给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
问题分析:找出关键字: 一个只出现一次,其余出现两次设计解题:借助题干给的每个元素均出现两次。可以使用异或运算,异或运算相等为0,不等则或。将数组从头至尾进行异或,最终剩下的即为只出现一次,这样时间复杂度O(N),空间复杂度O(1)Golang代码实现如下 len := len(nums) var num int for i := 0; i < len; i++{ num = num ^ nums[i] } return num}
2021-04-12 21:24:20 956
原创 golang中defer练习笔记
defer的使用golang中的defer延迟特性让c/c++中常忘记释放的对象的问题以及panic延迟,很好的解决了。现在看一下defer是如何处理的?使用defer时,会开辟一个单独的栈空间,将紧跟在defer关键字之后的逻辑放入此栈中,但是当多个defer套用时又是如何处理的。 func main(){ functest(func() { fmt.Println("second exec") //验证函数参数中包含函数指针的执行顺序 }) time.Sleep(1 * t
2021-04-02 21:19:23 138
原创 强一致性算法Raft解析
Raft算法背景分布式是一组独立的计算机,利用网络协同来工作的系统。客户看来就如同一台机器在进行工作。在信息爆照时代,传统的单机以无法应对需求了,分布式具有可扩展性强,可用性高,廉价高效的特点称为了服务发展的趋势。问题解决了高需求的问题,但同时也引入了新的问题,需求与服务之间的矛盾并没有彻底解决只是转换成可以分解的问题。CAP理论是分布式理论的基础,它提出三个要素:Consistency(强一致性):任何客户端都可以读取到其他客户端最近的更新;Availability(可用性): 系统一直处于可
2021-03-25 20:12:10 2175
原创 个人理解的动态规划思想
动态规划问题在各种面试中花式提问,实际工作中许多问题也需要动态规划思想编写代码,最近学习了动态规划思想,和大家分享一下。一、走楼梯问题一座10层楼梯一次只允许走 1 步 或者 2 步,那么有多少种方法走完这10层楼梯。先分析问题:从数学角度上讲就寻找1 与 2 的排列组合,相加等于 10,统计有多少种组合。1、排列组合对于每一阶,都有两种走法,走 1 步 或者 2 步,为了遍历所有的走法,写一个循环对于时间复杂度 O(2^N),空间复杂度 O(N)func getCombination(l
2021-03-13 17:12:18 182
原创 golang的sync.WaitGroup学习笔记
在golang中我们经常开启goroutine,很多新手可能踩过坑,明明开启了go func但是没有执行,函数就结束了。原因是主协程执行完毕返回结束整个进程,导致其他go func还没有执行就结束。对此种现象可以使用sleep解决,但是休息多久呢?1 微妙、1 毫秒、 1 秒这个无法确定,因为我们很难预测go func中需要执行多久,sleep过久导致浪费时间,sleep时间短了go func还没有执行完毕。这个时候sync.WaitGroup很好的解决了这个问题。WaitGroup官方是这样解释流程的:W
2021-03-11 18:00:25 449 1
原创 锁的底层原理
我们写各类系统应用,常见的网络变成,基本上都是并发编程,不论是多线程还是多进程、或者是协程、队列等。这些并发场景在对共享变量进行访问时,会带来数据不一致问题,这时就需要用到锁或者原子操作保证数据一致性。一、常见并发场景1、单一数值的增减,如:秒杀活动库存的递减,投票数的增加。2、对象结构的增减,如:优惠券的发送,在线用户列表。二、并发编程的几个概念1、并发执行不一定是并行执行2、单核cpu可以并发执行,不能并行执行并行是同一时刻多任务的处理,并发是同一时间段内的多任务处理。区别:多核的并行处
2021-03-07 18:11:59 3167
原创 golang使用grpc超时控制和对冲策略
超时控制grcp超时控制设置在客户端调用服务时,如果设定了超时时间,客户端会立即返回超时。超时控制一般有三个因素:链路超时:上有调用端通过协议字段把自己允许的超时时间传给当前服务,表示在该时间内返回数据,超时返回已无意义。流程如下图A调用B的总超时情况。消息超时:服务端收到请求消息到返回响应数据的最长消息处理时间。下图的B内部的当前请求整体超时时间。调用超时:当前服务调用下游服务设置的每一个rpc请求的超时时间。如下图B调用C的单个超时时间。通常一次请求会连续调用多次rpc,这个调用超时控制的是每个
2021-02-20 19:57:02 1301
原创 TCP面试相关问题
1、使用TCP的Socket发送数据的时候,会出现发送出错,WSAEWOULDBLOCK,在TCP中不是会保证发送的数据能够安全的到达接收端的吗?也有窗口机制去防止发送速度过快,为什么还会出错呢?2、TCP协议,在使用Socket发送数据的时候,每次发送一个包,接收端是完整的接受到一个包还是怎么样?如果是每发一个包,就接受一个包,为什么还会出现粘包问题,具体是怎么运行的?3、关于Send,是不是只有在非阻塞状态下才会出现实际发送的比指定发送的小?在阻塞状态下会不会出现实际发送的比指定发送的小,就是说只能
2020-10-25 17:38:33 166
原创 TCP粘包与解包
这里写自定义目录标题如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入什么是粘包TCP粘包是指发送方发送的若干包数据到接收方接收时粘成一包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾为什么会产生粘包TCP为了保证传输可靠,尽量减少额外开销(每次发包需要验证),采用流式传输,面向流的传输,减少
2020-10-25 00:28:29 370
原创 Golang中make和New的区别
new(T)为一个T类型的新值分配空间,并将此空间初始化为T的零值,并返回这块内存空间的地址们,也就是T类型的指针,该指针只想T类型所占用内存空间的地址,make(T)初始化之后的 T ,只能用于 slice map channel 三种类型,make(T , args)返回初始化之后的 T 类型的值,且此新值并不是 T 类型的零值, 也不是 T 类型的指针,而是 T 类型经过初始化之后的引用...
2020-09-25 14:58:07 175
原创 golang中结构体转json存储,结构体成员首字母必须大写,否则无法输出该项值的问题
golang中结构体转json存储,结构体成员首字母必须大写,否则无法输出该项值的问题首先看一个首字母小写的非正常输出package mainimport( "encoding/json" "fmt")typedef People struct{ name string `json:name`}func main(){ js := `{ "name" : "11" }`var p Peopleerr := json.Unmarshal([]byte(
2020-09-25 11:38:57 1099 3
原创 vc中本地加载非bmp和icon格式图片方法之一
最近在项目中需要用vc加载png图片,MFC中有加载bmp和icon格式的api可以直接用,没有直接加载png图片的api,针对这样的问题,用 CImage 类的 Load 函数加载图片,之后用 Detach 取得 HBITMAP句柄。取得图片的HBITMAP 句柄后就可以像操作 BMP 图片一样处理 JPG / JPEG / GIF / PNG格式的图片,具体代码如下:#include <atlimage.h> //CImage类头文件CImage img;HRESULT ret =
2020-09-16 14:48:57 164
FlowMangell.rar|FlowMangell.rar
2020-09-11
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人