MST

星途 面试题库

面试题:自定义实现类似Go切片的扩容机制

请尝试用Go语言自定义一个数据结构,该数据结构具备类似切片的追加元素功能,并且要实现与Go切片相似的扩容机制。详细阐述设计思路、关键代码实现以及对不同场景下扩容策略的考虑。
16.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

设计思路

  1. 自定义数据结构:创建一个结构体,内部包含一个数组用于存储元素,以及一个记录当前元素数量的字段。
  2. 追加元素功能:实现一个方法,在该方法中判断当前数组容量是否足够,如果不足则进行扩容,然后将新元素追加到数组中。
  3. 扩容机制:当需要扩容时,以一定比例增加数组容量,例如翻倍,以减少频繁扩容带来的性能开销。

关键代码实现

package main

import "fmt"

// 自定义数据结构
type MySlice struct {
    data   []int
    length int
}

// 创建新的MySlice实例
func NewMySlice() *MySlice {
    return &MySlice{
        data:   make([]int, 0, 10), // 初始容量设为10
        length: 0,
    }
}

// 追加元素方法
func (ms *MySlice) Append(num int) {
    if ms.length == cap(ms.data) {
        newCapacity := cap(ms.data) * 2
        newData := make([]int, ms.length, newCapacity)
        copy(newData, ms.data)
        ms.data = newData
    }
    ms.data[ms.length] = num
    ms.length++
}

// 获取元素方法
func (ms *MySlice) Get(index int) (int, bool) {
    if index < 0 || index >= ms.length {
        return 0, false
    }
    return ms.data[index], true
}

// 获取长度方法
func (ms *MySlice) Len() int {
    return ms.length
}

不同场景下扩容策略的考虑

  1. 小数据量场景:初始容量可以设置较小,如10,避免过多的内存浪费。扩容比例可以选择翻倍,因为数据量小,翻倍扩容不会造成过多的额外内存占用,同时也能减少扩容次数。
  2. 大数据量场景:初始容量可以根据预估数据量进行设置,减少初始阶段的扩容次数。扩容比例也可以翻倍,但如果对内存比较敏感,可以适当调整为1.5倍扩容,以平衡内存占用和扩容次数。同时,在大数据量下,每次扩容复制数据的开销较大,因此要尽量减少不必要的扩容操作。