Golang 中的slice

PHP写久了,对各种数据类型就不太在意了。一开始对Golang中slice类型的理解就是一个简单的array,今天在刷leetcode的时候碰到一个很有意思的题目Remove Duplicates from Sorted Array 题目描述如下:

Given a sorted array, remove the duplicates in place such that each element appear only once and return the new length.

Do not allocate extra space for another array, you must do this in place with constant memory.

For example,
Given input array nums = [1,1,2],

Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn't matter what you leave beyond the new length.

有意思的是 :Do not allocate extra space for another array, you must do this in place with constant memory.

大体的想法是写一个删除slice中元素的方法,然后再循环找到重复的值,删除之。

实现删除方法的时候碰到了很有意思的问题:Golang 中并没有append()的对应方法,没有减少slice长度的内建方法。想要减小slice的长度,只有对slice重新切片:s = s[x:y]。问题就是,重新切片有没有使用新的空间?

带着疑问查找了一些资料,其中Go博客中有一篇 Go 切片:用法和本质 讲解的非常透彻。其中提到了:

一个切片是一个数组片段的描述。它包含了指向数组的指针,片段的长度, 和容量(片段的最大长度)。
go-slices-usage-and-internals_slice-struct
长度是切片引用的元素数目。容量是底层数组的元素数目(从切片指针开始)。

s=s[2:4] 对切片重新切片
go-slices-usage-and-internals_slice-2
切片操作并不复制切片指向的元素。它创建一个新的切片并复用原来切片的底层数组。 这使得切片操作和数组索引一样高效。因此,通过一个新切片修改元素会影响到原始切片的对应元素。

d := []byte{'r', 'o', 'a', 'd'}
e := d[2:]
// e []byte{'a', 'd'}
e[1] = 'm'
// e
[]byte{'a', 'm'}
// d == []byte{'r', 'o', 'a', 'm'}

既然是一个指针,那就放心大胆的用了

func deleteNode(nums []int,index int) []int{
    nums=append(nums[:index],nums[index+1]...)
    return nums
}

搞定!

标签: none
返回文章列表 文章二维码
本页链接的二维码
打赏二维码
添加新评论