1.实现一个支持动态扩容的数组
满足的功能:增(从指定位置插入,从尾部插入)、删,查。
因为数组需要保证数据是连续的,所以当删除,和插入时,需要做数据搬移。相关实现代码如下:
package array
import (
"errors"
"fmt"
)
/**
*
* 实现一个大小固定的有序数组,支持动态增删改操作。
* Author: sxy
*/
type array struct {
data []int
length int // 数组目前存放的数据长度,已经初始化的数据。
}
func NewArray(cap int) *array {
if cap == 0 {
return nil
}
return &array{
data: make([]int, cap, cap),
length: 0,
}
}
func (arr *array) OutofArrayRange(index int) error {
if index > arr.length {
return errors.New("array index is out of ")
}
return nil
}
// 根据指定的索引拿值
func (arr *array) Find(index int) (int, error) {
err := arr.OutofArrayRange(index)
if err != nil {
return 0, err
}
return arr.data[index], nil
}
func (arr *array) Insert(index, value int) error {
if arr.length >= cap(arr.data) {
return errors.New("the full array")
}
err := arr.OutofArrayRange(index)
if err != nil {
return err
}
// 因为是插入,后面的数据需要搬移 a[11]=a[10] a[1o]=a[9]
// 而不能是这样 a[8]=a[7],a[9]=a[8]
for i := arr.length; index < i; i-- {
arr.data[i] = arr.data[i-1]
}
arr.data[index] = value
arr.length++
return nil
}
func (arr *array) Delete(index int) error {
err := arr.OutofArrayRange(index)
if err != nil {
return err
}
// 因为是删除,所以也需要数据搬移:a[6]=a[7], a[7]=a[8]
for i := index; i < arr.length-1; i++ {
arr.data[i] = arr.data[i+1]
}
arr.length--
return nil
}
func (arr *array) Print() {
var format string
for i := 0; i < arr.length; i++ {
format += fmt.Sprintf("|%+v", arr.data[i])
/* %+v会带上Type
{Nan 33}
{name:Nan id:33}
*/
}
fmt.Println(format)
}