go语言的切片与长度和容量的关系

今天,我开始了我每日必刷的leetcode题目,作为一个javaer,go语言也是我需要接触和学习的一门语言,所以最近我也一直在用go语言进行题目求解。

今天遇到了一个关于树的结构,按照java的思路,我需要一个栈才能很轻松的解决这个问题。但是换到了go里面,我好想还没接触到go的栈结构是什么,因此我选择了切片进行模拟。这个题目如下:

515. 在每个树行中找最大值
给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

tips:
二叉树的节点个数的范围是 [0,104]
-231 <= Node.val <= 231 - 1

因此假设如果是一个满二叉树,那么一层最多有200左右的节点,因此我定义了一个300长度的切片。

arr := make([]*TreeNode, 300, 300)

我想着,提前分配好空间,然后运行的时候,会快一点儿,所以我就没有使用动态的方式去创建,动态的方式如下:

arr := []*TreeNode{}

然后在这个算法里面,有这样一步:

arr = arr[1:]

也就是把第一个节点拿出来作为当前节点,然后接着放这个节点的左右孩子进去,不断遍历,实现栈的模拟。我当时以为,这样切掉,只会让长度 len 减少,容量 cap 不会变,但是提交答案的时候,报了空指针异常,当时排查发现是这里的问题,接着我就去实现这个过程中 lencap 是怎么变化的。

package main

import (
	"fmt"
	"reflect"
)

func main() {
	t := make([]int, 3, 10)
	fmt.Println(len(t), cap(t))
	t = t[1:]
	fmt.Println(len(t), cap(t))
}

运行结果如下:

3 10
2 9

事实表明,lencap 都变小了,因此这里我把切片的定义重新改为了动态的方式,顺利通过。

tips:刚开始学go没多久,如果解释的不合理欢迎指正,本文主要是记录学习过程中遇到的小坑

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为什么我不是源代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值