leetcode_763
Golang: 思路:这题贪心解法其实很好想,不过我最终实现了O(n)的时间复杂度解法,执行效果上在时间复杂度上超过100%。 代码如下: func partitionLabels(S string) []int { var res []int arr:=make([][]int,26) used:=make([]int,26) for i:=0;i
Golang: 思路:这题贪心解法其实很好想,不过我最终实现了O(n)的时间复杂度解法,执行效果上在时间复杂度上超过100%。 代码如下: func partitionLabels(S string) []int { var res []int arr:=make([][]int,26) used:=make([]int,26) for i:=0;i
Golang: 思路:搬运我的题解 这题在第一次做的时候嫌麻烦,直接用数组解决了,时间百分百,空间百分之五,还是有些不满意的,就用双指针重新写了下,然后来到了双百效率 思路在代码里有提及,就不再详述了,简单说一下这里替换的含义 1->4->3->2->5->2, x = 3 发生替换的时候 p1 p2 p3 1->4->3->2->5->2 这里怎么替换,就是: 先从原链表里提取出p3, 然后将p3插到p1及p1后面的元素之间, 更新p1,更新p3 代码如下: func partition(head *ListNode, x int) *ListNode { if head==nil||head.Next==nil { return head } //什么时候需要替换呢? //当我找到某个元...阅读全文
首发于个人公众号:《Python编程时光》 我的博客原文:python.iswbm.com/en/latest/c… 我的 Github:github.com/iswbm/Pytho… 在之前写过一篇关于虚拟环境使用的文章 :Python 虚拟环境使用指南. 但是还没有好好的介绍一下 Python 的用户环境,原因是自己一直没遇到要使用 用户环境 的使用场景,所以就一直懒得写。 恰巧这两天,自己遇到了一个使用用户环境的体验可以完爆虚拟环境的案例,就拿出来分享一下。 1. 我的使用背景 公司有数以万计的服务器,为了对实现对访问记录进行集中管理以及出于安全考虑,每台服务器都有访问限制,必须使用公司的跳板机才能登陆。 每个公司的员工在跳板机上都有自己的用户、 家目录,对于很多需要 root 权限的...阅读全文
1 单行声明 常量单行声明使用的语法如下。常量声明的位置可以是全局(所有函数外部)、局部(函数内部)。// PI is for math caculateconst PI = 3.142 批量声明 批量声明的方法跟变量声明类似,语法如下:const ( MON = 1 TUD = 2 WEN = 3 )3 iota 使用 iota 是常量的初始值定义符。默认值是 0。但是如果在批量常量定义的时候,出现在第几行,值等于“行号-1”。3.1 依次递增 代码如下:const ( t1 = iota t2 t3) 输出结果:0123.2 嵌入匿名常量 匿名常量用 _ 表示,代码如下:const ( t1 = iota t2 _ t3) 输出结果:0133.3 批量声明中多次使用 代码如下:const...阅读全文
Golang: 思路:每日一题之BFS,岛屿的最大面积,DFS和BFS都可以做,我用了BFS和栈。 代码如下: func maxAreaOfIsland(grid [][]int) int { res:=0 if len(grid)==0{ return res } for i:=0;i
ARTS ARTS 是陈浩(网名”左耳朵耗子“)在极客时间专栏里发起的一个活动,目的是通过分享的方式来坚持学习。 每人每周写一个 ARTS:Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。 算法 LeetCode 78 Subsets & 90 Subsets II 先看一下题目要求。 78.Subsets Given a set of **distinct** integers, _nums_, return all possible subsets (the power set). Note: The solution set must not contain duplicate subsets...阅读全文
Given a non-empty, singly linked list with head node head, return a middle node of linked list. If there are two middle nodes, return the second middle node. Example 1: Input: [1,2,3,4,5] Output: Node 3 from this list (Serialization: [3,4,5]) The returned node has value 3. (The judge's serialization of this node is [3,4,5]). Note that we returned a...阅读全文
Golang: 思路:DP预处理,递归加回溯,这题要想效率不错,还是有些难度的 代码如下: func partition(s string) [][]string { if len(s)==0{ return [][]string{{}} } dp:=make([][]int,len(s)) for k,_:=range dp{ dp[k]=make([]int,len(s)) } for i:=len(s)-1;i>=0;i--{ for j:=i;j
简介 在上一篇文章中,我们介绍了flag库。flag库是用于解析命令行选项的。但是flag有几个缺点: 不显示支持短选项。当然上一篇文章中也提到过可以通过将两个选项共享同一个变量迂回实现,但写起来比较繁琐; 选项变量的定义比较繁琐,每个选项都需要根据类型调用对应的Type或TypeVar函数; 默认只支持有限的数据类型,当前只有基本类型bool/int/uint/string和time.Duration; 为了解决这些问题,出现了不少第三方解析命令行选项的库,今天的主角go-flags就是其中一个。第一次看到go-flags库是在阅读pgweb源码的时候。 go-flags提供了比标准库flag更多的选项。它利用结构标签(struct tag)和反射提供了一个方便、简洁的接口。它除了基本的功...阅读全文
Golang: 思路:贪心,首先,我们需要知道每个数字在数组中出现的数目,然后将这些数目做个排序,每次都删去出现最多次数的数目,直到这些删除的数目之和超过了数组长度的一半。 代码如下: func minSetSize(arr []int) int { mp:=make(map[int]int) for _,v:=range arr{ mp[v]++ } var val []int for _,v:=range mp{ val=append(val,v) } sort.Ints(val) temp:=0 for i:=len(val)-1;i>=0;i--{ temp+=val[i] if temp>=len(arr)/2{ return len(val)-i } } return 0 ...阅读全文
Golang: 思路:晚上的效率很低,写代码的感觉也差到了极点。。。 代码如下: func mergeKLists(lists []*ListNode) *ListNode { length:=len(lists) if length==0{ return nil } for length!=1{ for i:=0;i
Golang: 思路:算是贪心吧,就是尽可能喂饱更多的孩子。但是非常简单,我们的思路就是,先喂食量最小的孩子,并且用尽可能小的饼干去喂饱这些孩子。 实现思路:先对两个数组排序,双指针,最小的饼干去喂最小的孩子,行的话,双指针各向后一位,不行的话,用下一块饼干再去尝试。直到所有孩子都被喂饱,或者所有饼干都被试过了。 代码如下: func findContentChildren(g []int, s []int) int { if len(g)==0||len(s)==0 { return 0 } sort.Ints(g) sort.Ints(s) i,j:=0,0 res:=0 for i
Golang: 思路:这题没有好的思路,双重递归吧,第一次拿到所有节点,第二次对所有节点进行递归,看看有没有路径符合题目要求。这里讲下我最初的思路:我最开始想的是,把每一条从根节点到叶子节点的路径都提取出来(以数组的形式),然后去对数组做处理,这样会不会效率高一些。后面思考不难发现,这样如果可以实现,会有很多重复的路径被算进总和。所以,这题可能就只剩下暴力的求解思路了。 再插一句,递归这东西,在树结构里真的是无往不利。 代码如下: func pathSum(root *TreeNode, sum int) int { if root==nil { return 0 } var nodes []TreeNode traverse(root,&nodes) res:=0 for _,v:=ran...阅读全文
Golang: 思路:广度优先实现层序遍历 代码如下: func levelOrder(root *Node) [][]int { var res [][]int var arr[]*Node if root!=nil{ arr=append(arr,root) for len(arr)!=0{ temp:=len(arr) var level []int for i:=0;i
问题描述: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 示例: 给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1] 解题思路: 1.暴力法 利用两层循环查找和为目标值的两个整数,并返回下标。 2.HashMap两层循环 先将数组中的值和下标作为key和value存到HashMap中,然后遍历数组,计算差值是否在HashMap中,若存在,返回对应两个目标值的下标。 注意:有缺陷,对于数组中存在相同元素,得到的下标,有问题。例如[3...阅读全文
Go语言的程序元素 Go语言包含了五种程序符号,分别是标识符(identifier)、关键字(keyword)、运算符(operator)、分隔符(delimiter)与字面量(literal)。这五种程序元素组合成各种表达式和语句。 标识符标识符是用于标识变量、函数或任何用户自定义项目的名称(程序实体) 标识符可分为两类,一类是用户定义的标识符,作为程序实体存在;另一类是预定义标识符,它们在Go语言中的源代码被声明(如数据类型)。还有一个特殊的标识符,叫空标识符,记作 "_",一般用在变量声明与包的导入中。例如,在Go语言程序中,若存在一个没有使用的变量a,那么编译时就会报错,因为Go语言要求存在的程序实体必须被使用,这时就可以使用这样一句 _=a 的代码,编译器就会认为已经使用了变量a(...阅读全文
Golang: 思路:广度优先搜索,这里需要注意,当我们将目前新鲜但下一轮即将腐烂的橘子添加入我们的栈时,我们最好能改变下这个橘子的状态,防止重复搜索 代码如下: func orangesRotting(grid [][]int) int { var stack [][]int freshO,res:=0,0 for i:=0;i
一、下载 golang ,下载后点击安装 国内下载地址 https://studygolang.com/dl 二、配置环境变量 GOPATH : go的工作目录,可以自定义,在该目录下一般需要创建3个文件夹,也可以只创建src文件夹 bin : go编译后的可执行的二进制文件 pkg:go编译生成的中间文件 src : go资源文件,存放第三方库和项目代码 注: 使用 go get 下载第三方包时需要进入src目录下再执行 go get 命令 GOROOT : go的安装目录,eg: D:\go GOBIN : go安装目录下的 bin 目...阅读全文
Golang: 思路:暴力算法 代码如下: func reverseStr(s string, k int) string { if len(s)<=1 { return s } bytes := []byte(s) reverseBytes(bytes,0,k) return string(bytes) } func reverseBytes(arr []byte,i int,k int) { j:=k-1+i //剩余字符串小于k if j>len(arr)-1 { j=len(arr)-1 swapBytes(arr,i,j) return } //剩余字符串大于k小于等于2k if j+k>=len(arr)-1 { swapBytes(arr,i,j) return }else {...阅读全文
Golang: 思路:这题就是套了个回文串的壳子,实际上呢,就是找到字符串里所有成对字母的数量,然后,如果有落单的,这个数目就加1。 实现:我用了个长度为52的数组存储所有单词的数目,然后统一处理,求出上文提到的数目。 代码如下: func longestPalindrome(s string) int { if len(s)<=1 { return len(s) } temp:=make([]int,52) for _,v:=range s{ if v>=97 { temp[v-97]++ }else{ temp[v-39]++ } } f,sum:=0,0 for i:=0; i< len(temp); i++ { sum=sum+temp[i] if f==0 { if temp[i]...阅读全文
Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化,使得 defer 的性能开销在大部分场景下都得到大幅降低,其中到底经历了什么原理? 这是因为这两个版本对 defer 各加入了一项新的机制,使得 defer 语句在编译时,编译器会根据不同版本与情况,对每个 defer 选择不同的机制,以更轻量的方式运行调用。 堆上分配 在 Golang 1.13 之前的版本中,所有 defer 都是在堆上分配,该机制在编译时会进行两个步骤: 在 defer 语句的位置插入 runtime.deferproc,当被执行时,延迟调用会被保存为一个 _defer 记录,并将被延迟调用的入口地址及其参数复制保存,存入 Goroutine 的调用链表中。 在函数返回之前的位置插入 r...阅读全文
Golang: 思路:这题难度在于理解题意,什么叫下一个排列,简单来说,给定一个数组[1,2,3,4,5],我们可以把它看成一个整数12345,那么它的下一个排列也就是12354,即大于12345的最小的排列。解题过程就是,从后往前,找到非递增的第一个数,再从后往前,将它从它以后的大于它的第一个数交换,然后反转它后面的剩下的数组部分。举个比较有代表性的例子,[3,6,5,4,3],从后往前找到非递增的第一个数3,位置是arr[0],再从后往前,将它从它以后的大于它的第一个数(也就是4)交换,交换完以后,数组变成[4,6,5,3,3],可以看到,4后面的部分都是递减的,于是我们反转这些部分即可。 代码如下: func nextPermutation(nums []int) { if len(n...阅读全文
Golang: 思路:其实就是找到每行每列的最大值,根据这些最大值来为数组里的元素增加值 代码如下: func maxIncreaseKeepingSkyline(grid [][]int) int { res:=0 maxR:=make([]int,len(grid)) maxC:=make([]int,len(grid[0])) for i:=0;i
Golang: 思路:这个,建立个数组,对应'a','b','l','o','n',每当出现'a','b','n'时,对应数组位置加二,出现'l','o'时,对应数组位置加一,然后遍历数组,找到最小值,除以2即可 代码如下: func maxNumberOfBalloons(text string) int { res:=make([]int,5) for i:=0;i
Golang: 思路:这题虽然在并查集范畴内,但做法更近于广度优先搜索,和烂橘子一致,需要改变不被围绕区域内'O'的值,以防止重复的查询 代码如下: func solve(board [][]byte) { if len(board)<=2||len(board[0])<=2 { return } var stack [][]int for i:=0;i
Golang: 思路:这题不是要求输出最右边的路径,而是你从最右侧看去,每一层的最右端的点。方法就是BFS进行层序遍历,每次将最右边的那个放进结果里了。 代码如下: func rightSideView(root *TreeNode) []int { var res []int var nodes []*TreeNode if root!=nil { nodes=append(nodes, root) for len(nodes)!=0{ length:=len(nodes) res=append(res, nodes[length-1].Val) i:=0 for ;i
Golang: 思路:组合题,先反转链表,再让它们相加,再反转回来即可。针对题目提到的进阶,可以先将两个链表拷贝下来做大数加法,再赋值回去或者新开一条链表 代码如下: func addTwoNumbers(l1 *ListNode, l2 *ListNode) *ListNode { l1 = reverseList(l1) l2 = reverseList(l2) temp:=addTwoLinkedLists(l1,l2) return reverseList(temp) } //两个链表相加,使用的某大佬的代码 func addTwoLinkedLists(l1 *ListNode, l2 *ListNode) *ListNode { var temp = &ListNode{} va...阅读全文
前言 工作一段时间之后,最大的感觉就是算法好像没什么用,确实不会算法也能胜任平常的工作,但是总觉得缺了点什么,所以最近抽空复习了以前刷的 Leetcode,希望在这里找到一群志同道合的人。 两数之和(Two Sum) 这是 LeetCode 的第一题,总体来说是比较简单的,题干如下: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。示例: 给定 nums = [2, 7, 11, 15],target = 9 因为 nums[0] + nums[1] = 2 + 7 = 9 所以返回 [0, 1]来源:力扣 简单来说就是给定一个数组,让你找到和为 target 的两个元素的索引。 解题思路 主要有 两种解题思路 : 暴力...阅读全文
在网络应用开发中,开发者首先要做的一个决定是使用 TCP 还是 UDP 作为传输层协议。TCP 是基于连接,并且基于字节流提供可靠的数据传输的协议。而 UDP 是无连接,通过数据包发送数据,并不保证送达的协议。 我们将在这一节分别利用 UDP 和 TCP 实现一套 client-server 程序。 该程序主要完成的功能是: client 从键盘读取一行字符串,并发给 server server 收到字符串并转换成大写 server 将修改后的字符串发送给 client client 收到修改后的数据并显示 2.7.1 Socket Programming with UDP UDP 在发送数据包时,需要先在数据包中附加地址的信息。网络会利用这个信息 route 数据包到达接收程序。 附加的地...阅读全文
知识点 接收者 type Circle struct { Radius float64 } func (c Circle) Area() float64 { return 0 } 声明方法的语法跟函数差不多,因为他们本身就很相似。唯一的不同是方法接收者的语法 func(receiverName ReceiverType) MethodName(args) 当方法被这种类型的变量调用时,数据的引用通过变量 receiverName 获得。在其他许多编程语言中这些被隐藏起来并且通过 this 来获得接收者。 把类型的第一个字母作为接收者变量是 Go 语言的一个惯例。 r Rectangle 断言优于逻辑 当测试用例不是一系列操作,而是事实的断言时,测试才清晰明了。 列表测试驱动 声明结构体以创建...阅读全文
介绍 Python 炫酷功能(例如,变量解包,偏函数,枚举可迭代对象等)的文章层出不穷。但是还有很多 Python 的编程小技巧鲜被提及。因此,本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是我平时会用到的的。让我们一探究竟吧! 整理字符串输入 整理用户输入的问题在编程过程中极为常见。通常情况下,将字符转换为小写或大写就够了,有时你可以使用正则表达式模块「Regex」完成这项工作。但是如果问题很复杂,可能有更好的方法来解决: 1. user_input = "This\nstring has\tsome whitespaces...\r\n" 3. character_map = { 4. ord('\n') : ' ', 5. ord('\t') : ' ', 6. ord('\...阅读全文
Golang: 思路:既然是链表的插入排序,那就按照题意来,做插入排序 代码如下: func insertionSortList(head *ListNode) *ListNode { if head==nil||head.Next==nil { return head } temp1:=head res:=head temp2:=head.Next temp1.Next=nil for temp2!=nil{ //预留下一个点 tNext:=temp2.Next temp2.Next=nil var p1 *ListNode p2:=res for p2!=nil&&temp2.Val>p2.Val{ p1=p2 p2=p2.Next } temp2.Next=p2 if p1==nil ...阅读全文
Golang: 思路:对所有字符串处理(排序),字母异位词必然会有同一排列。 代码如下: type Bytes []byte func (b Bytes) Len() int { return len(b) } func (b Bytes) Less(i, j int) bool { return b[i] < b[j] } func (b Bytes) Swap(i, j int) { b[i], b[j] = b[j], b[i] } func groupAnagrams(strs []string) [][]string { mp:=make(map[string][]string) for _,v:=range strs{ bytes:=[]byte(v) sort.Sort(Byt...阅读全文
文章首发自公众号:Go编程时光 《Go编程时光》,一个能带你学习 Go 语言的专栏,同时欢迎搜索我的同名公众号【Go编程时光】(排版精美更适合阅读),第一时间获取Go语言干货。 系列导读 1. 一文搞定Go语言开发环境的搭建 2. Go 语言中五种变量创建的方法 3. Go语言中的整型与浮点型 4. Go语言中byte、rune与字符串区别? 1.7 1. 数组 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。因为数组的长度是固定的,所以在Go语言中很少直接使用数组。 声明数组,并给该数组里的每个元素赋值(索引值的最小有效值和其他大多数语言一样是 0,不是1) // [3] 里的3 表示该数组的元素个数 var arr [3]int arr[0] = 1 ar...阅读全文
python3.8版本已经更新,数据分析师和数据开发者看过来 新版本python3.8已经发布 作为一个放弃java转投python很多年的数据开发者,已经好久没有更新python了,也很久没有关注python的一些新功能新特性了,去年把自己做的几个小项目更新到了python3.6,然后就一直没把精力放到这一块了。 今天因为安装一个第三方库失败,打算去官网看下python的更新情况,发现已经更新至python3.8.2了,那么就当机立断下载安装,顺便学习一下python3.8的新特性吧。 安装python3.8.2 windows下的安装很简单,直接下载msi安装文件双击就可以了,然后稍微配置一下环境变量。 Linux下稍微复杂一点,主要是因为没有合适的yum安装包,具体步骤如下: # 下载...阅读全文
Golang: 思路:双map映射即可,但这里错了一次,惭愧 代码如下: func findAndReplacePattern(words []string, pattern string) []string { var res []string for _,v:=range words{ flag:=0 mp1:=make(map[byte]byte) mp2:=make(map[byte]byte) for i:=0;i
Golang: 思路:多源BFS 代码如下: func updateMatrix(matrix [][]int) [][]int { res:=make([][]int,len(matrix)) for k,_:=range res{ res[k]=make([]int,len(matrix[0])) copy(res[k],matrix[k]) } var stack [][]int for i:=0;i
Golang: 思路:二叉树用递归就对了,但是这题我不会!!!思路是对的,但是脑子就是转不过来 代码如下: func distributeCoins(root *TreeNode) int { ans:=[]int{0} dfs979(root,&ans) return ans[0] } func dfs979(root *TreeNode,ans *[]int) int{ if root==nil{ return 0 } L:=dfs979(root.Left,ans) R:=dfs979(root.Right,ans) (*ans)[0]+=abs(L)+abs(R) return root.Val+L+R-1 ...阅读全文
Golang: 思路:这题我个人感觉要复杂一些,难度在于首尾相连,并且,你需要考虑的更全面一些。当然,这题做完的时间复杂度100%,空间47%,但我不太想优化了。简单来说,有房子[1...n],通过打家劫舍1得出的最大值,我们需要做出判断:如果我们没抢n,那么这个最大值没有问题,如果我们抢了n,那么就需要去看下我们抢没抢1,如果也没抢1,那么没问题,但如果抢1了,那么这个最大值就需要修改了,为max([2....n],[1...n-1])。 代码如下: func rob(nums []int) int { if len(nums) == 0 { return 0 } if len(nums) == 1 { return nums[0] } if len(nums) == 2 { if num...阅读全文
Golang: 思路:模拟大数乘法,实现麻烦,实现难度并不大 代码如下: func multiply(num1 string, num2 string) string { if num1[0]=='0'||num2[0]=='0'{ return "0" } bytes1:=[]byte(num1) bytes2:=[]byte(num2) res:="0" s:="" for i:=len(num2)-1;i>=0;i--{ var temp strings.Builder temp.WriteString(s) s+="0" n:=0 t:=int(bytes2[i]-'0') if t!=0{ for j:=len(num1)-1;j>=0;j--{ mu:=t*int(bytes1[...阅读全文
Golang: 思路:依旧是中序遍历,如果数组是递增的,那么二叉搜索树是正确的 代码如下: func isValidBST(root *TreeNode) bool { arr := inOrderValDFS(root) for i := 1; i < len(arr); i++ { if arr[i] <= arr[i-1] { return false } } return true } func inOrderValDFS(root *TreeNode) []int { var stack []*TreeNode var res []int for len(stack) != 0 || root != nil { for root != nil { stack = append(st...阅读全文
导语 作者李志宇,腾讯云后台开发工程师,日常负责集群节点和运行时相关的工作,熟悉 containerd、docker、runc 等运行时组件。近期在为某位客户提供技术支持过程中,遇到了 containerd 镜像丢失文件问题,经过一系列分析、推断、复现、排查,最终成功找到根因并给出解决方案。现将整个详细处理过程整理成文分享出来,希望能够为大家提供一个有价值的问题处理思路以及帮助大家更好地理解相关原理。 containerd 镜像丢失文件问题说明 近期有客户反映某些容器镜像出现了文件丢失的奇怪现象,经过模拟复现汇总出丢失情况如下: 某些特定的镜像会稳定丢失文件; “丢失”在某些发行版稳定复现,但在 ubuntu 上不会出现; v1.2 版本的 containerd 会文件丢失,而 v1.3 不...阅读全文
Golang: 思路:这题属于简单题,思考上存在一点难度,最长回文串构建就是把所有成对的字母全部集中到一起,如果还有多余的字母,取一个即可。 代码如下: func longestPalindrome(s string) int { if len(s)<=1 { return len(s) } temp:=make([]int,52) for _,v:=range s{ if v>=97 { temp[v-97]++ }else{ temp[v-39]++ } } f,sum:=0,0 for i:=0; i< len(temp); i++ { sum=sum+temp[i] if f==0 { if temp[i]%2!=0 { f=1 } }else{ if temp[i]%2!=0 { ...阅读全文
1_CdjOgfolLt_GNJYBzI-1QQ.jpeg 接口概念 接口 即一组方法定义的集合,定义了对象的一组行为,由具体的类型实例实现具体的方法。换句话说,一个接口就是定义(规范或约束),而方法就是实现,接口的作用应该是将定义与实现分离,降低耦合度。习惯用“er”结尾来命名,例如“Reader”。接口与对象的关系是多对多,即一个对象可以实现多个接口,一个接口也可以被多个对象实现。 接口(interface) 是Go语言整个类型系统的基石,其他语言的接口是不同组件之间的契约的存在,对契约的实现是强制性的,必须显式声明实现了该接口,这类接口称之为“侵入式接口”。而Go语言的接口是隐式存在,只要实现了该接口的所有函数则代表已经实现了该接口,并不需要显式的接口声明。 接口的作用 接口是实现...阅读全文
Go语言以容易进行并发编程而闻名,但是如果稍不注意,并发程序可能导致的数据竞争问题(data race)就会经常出现在你编写的并发程序的待解决Bug列表中-- 如果你不幸在代码中遇到这种错误,这将是最难调试的错误之一。 今天这篇文章里我们首先来看一个导致数据竞争的示例程序,使用go命令行工具检测程序的竞争情况。然后我们将介绍一些在不改变程序核心逻辑的情况下如何绕过并解决并发情况下的数据竞争问题的方法。最后我们会分析用什么方法解决数据竞争更合理以及留给大家的一个思考题。 本周这篇文章的主旨概要如下: 并发程序的数据竞争问题。 使用go命令行工具检测程序的竞争情况。 解决数据竞争的常用方案。 如何选择解决数据竞争的方案。 一道测试自己并发编程掌握程度的思考题。 数据竞争 要解释什么是数据竞争我们...阅读全文
Golang: 思路:先求和判断能否除以3,能的话开始遍历元素并相加,每当和等于总和的1/3时,将和清零并继续向下遍历,再出现一次和的1/3即可返回true,否则返回false 代码如下: func canThreePartsEqualSum(A []int) bool { sum:=0 for i:=0;i
Golang: 写在前面:这题如果是用我46的代码是改不出来的,除非得到所有结果再去删除重复的,但这样自然就没什么意思了,我在这道题上花了差不多整整半天,去研究了深度优先、回溯和剪枝,并试图应用进我的代码里,但最终还是失败了。 思路:可以参见liweiwei大佬的题解,很有帮助。我只在这里描述下我上一题的代码为什么无法应用在这一次的题里。我上一题的解法是,如果有[1,2,3,4,5]这样的数组,我在第一轮的起始数组分别是[1,2,3,4,5],[2,1,3,4,5],[3,2,1,4,5],[4,2,3,1,5]等。即我每次会将第i位和第1位互换,这在全排列里是行得通的。而深度优先加回溯第一轮的起始数组是[1,2,3,4,5],[2,1,3,4,5],[3,1,2,4,5],[4,1,2,3...阅读全文
系列文章:总目录索引:九析带你轻松完爆 go 系列教程目录1 前言2 一维数组 2.1 一维数组声明 2.2 一维数组初始化 2.2.1 全量初始化 2.2.2 长度推测初始化 2.2.3 指定索引初始化 2.3 一维数组遍历 2.3.1 索引遍历数组 2.3.2 range 遍历数组3 二维数组 3.1 二维数组声明 3.2 二维数组初始化 3.3 二维数组遍历 3.3.1 索引遍历 3.3.2 range 遍历1 前言 如果你对博客有任何疑问或者想更深入学习 go,请加微信群,我们一起进步:2 一维数组2.1 一维数组声明 一维数组声明是三段式:var arr_name [arr_length] arr_type 样例代码如下:var arr [2]int2.2 一维数组初始化2.2.1...阅读全文
Golang: 思路:这题O(1)空间复杂度,其实只需要拆分成两个链表,然后连接下就好了 代码如下: func oddEvenList(head *ListNode) *ListNode { nd1,nd2:=&ListNode{Val:0},&ListNode{Val:0} node1,node2,temp,flag:=nd1,nd2,head,0 for temp!=nil{ if flag%2==0{ node1.Next=temp node1=node1.Next }else{ node2.Next=temp node2=node2.Next } temp=temp.Next flag++ } node2.Next=nil node1.Next=nd2.Next return nd1...阅读全文
Golang: 思路:DP,但是这题我最终实现的效率很低,所以有待优化 代码如下: func jump(nums []int) int { if len(nums)<=1 { return 0 } arr:=make([]int,len(nums)) arr[0]=0 for i:=0;i