Go语言解leetcode(一)

0. 简介

最近在学Go语言,但是没怎么练习,因此在leetcode上用Go语言刷算法题巩固一下Go基础。

1. 最接近的三数之和?

16. 最接近的三数之和 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:先排序然后再去求取目标值,因为这里的要求是三个数,可以在固定一个最小值(三数中的相对最小值)的情况下,将问题转换为求最接近的两数之和,然后对其使用双指针的解法。同时有一个地方需要注意的是,在求绝对值的时候需要自己额外写一个函数,因为math包提供的不支持int只支持float64,无法转型。排序算法可以直接使用sort.Ints([]int)。

go初始化一个数组:

tar:=[]type{val1,val2,……}

2. 有效的括号:

20. 有效的括号 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:使用栈的思想,先进后出完成匹配,对于左括号,一律使用入栈的行为。而对于右括号,如果栈顶元素不为相互匹配的左括号,则证明匹配失败,因此输出false;如果匹配成功,那么我们应该将栈顶的元素取出,直到栈空,在需要匹配的时候栈空也输出false。最后完成所有的匹配之后,如果栈中还有未匹配的左括号,那么此时也是输出false,否则输出true。

这里使用的是切片来实现栈的结构,也可以通过struct来定义栈,此外,对于输入案例string,采用了string[]的方式来取出相应索引位置的值,类型为char。在使用append方法给切片追加内容的时候需要使用相应的变量来接收值,否则会报错。

stack := make([]byte,0)
stack = append(stack,char)
stack = stack[:len(stack)-1]

3. 合并两个有序链表:

21. 合并两个有序链表 - 力扣(LeetCode) (leetcode-cn.com)

ListNode的数据结构:

type ListNode struct{
    Val int
    Next *ListNode
}
//如果这里的递归结构放的不是指针,那么ListNode的大小是不固定的
//因为可以完成无限循环

解题思路:使用一个新的ListNode,通过比较两个链表之间的数据大小,来决定新ListNode的下一个节点是哪一个,循环条件为两个链表都非空。如果跳出了循环,那么一定存在剩下有一个链表还没执行完的情况,于是需要判断链表是否为空,非空则直接成为新ListNode的Next部分。

需要注意的是,ListNode和*ListNode的初始化方式不一样,*ListNode需要带上取地址符,而ListNode不用,同理,ListNode中的Next数据项在初始化的时候也需要带上取地址符。此外,因为head参与了运算(即需要跟着移动),这里我们定义了一个标记位tar,用来表示新ListNode的头结点的前置结点,方便做结果返回。需要注意的是,如果标记位是值类型赋值,则是拷贝后赋值了一份新的变量,后续的head赋值变化与其无关,这样在一开始如果定义的Next是空的话,返回结果也是空。因此,标记位需要为指针类型,这样才可以明确指向目标。

var list1 *ListNode = &ListNode{1,&ListNode{2,&ListNode{3,nil}}}
var head *ListNode = &ListNode{-1,nil}
var tar *ListNode = head

4. 两两交换链表中的节点:

24. 两两交换链表中的节点 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:这里需要定义三个节点,pre,head,next。pre结点为前置结点,head结点为需要被交换位置的部分的最后一个结点,next结点为head结点的下一个结点。将head.Next指向next.Next,next.Next指向head,pre.Next指向next,这样就完成了pre->next->head的链表转换,然后next->head这一部分在链表反转中需要被继续交换位置,因此head即为需要被交换位置的部分的最后一个结点。本题为两两交换,因此完成一次交换后,更改head和next的指向即可。但如果在链表反转的题目中,next.Next应该指向pre.Next。此外还有一个需要注意的点是,做完head和next的指向更改,需要判断head是否为空,如果head为空,则不应该有next=head.Next。

head.Next=next.Next
next.Next=pre.Next
pre.Next=next

5. K个一组翻转链表:

25. K 个一组翻转链表 - 力扣(LeetCode) (leetcode-cn.com)

解题思路:计算链表的长度,如果链表长度小于k,那么直接返回,如果k为1也直接返回。对链表长度做除运算,计算翻转组的数目,再一一对每一组进行翻转。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值