某大厂二面编程题-用固定长度数组模拟队列实现

本文分享了一次某大厂二面的编程题,要求使用固定长度数组模拟队列,实现了入队、出队、获取队列长度和判断队列是否已满的功能。讨论了切片和固定长度数组两种实现方式,强调了结构体字段封装的重要性,以及面试中的应对策略。


前言

刚面完某大厂二面golang后端,面试官人很好,给我出的面试题没那么难,但刚拿到手还是很懵B的,第一反应是拿切片实现,面试官同意了。虽然有点波折,但还是用切片做出来了。过程中有了数组实现的思路,就给面试官说了,他就我的思路问了几个问题,我回答的7788。二面也让我通过了,感恩。等待HR面,期待Offer。


一、题目

要求用固定长度数组模拟队列,要求实现入队、出队、队列长度、队列是否已满4个方法。

二、解决

1.切片实现

队列的特点是先进先出,我们只需要模拟这一过程就行。

go语言中,本来就可以用切片实现一个队列,入队的时候append到尾部,出队的时候,从头部开始切。经面试官提点,加了长度。注意实现的过程中出队时要判断队列里还有没有元素;入队时不能超过指定长度。

由于切片实现过于简单,我就只贴个结构体就行了,方法就不写了

type Queue struct {
	len   int
	arr   []int
}

2.固定长度数组实现

固定长度数组实现队列,需要注意的点是:

  • 定义队列的长度
  • 定义队列的头位置和尾位置
  • 入队时队尾指针向后移,出队时对头指针向后移
  • 注意头尾位置超过数组的最大长度处理
package main

import (
	"errors"
	"fmt"
	"sync"
)

func main() {
	queue := Queue{}
	var err error
	for i := 0; i < 12; i++ {
		if err = queue.In(i); err != nil {
			fmt.Println("入队失败,错误信息:", err)
		} else {
			fmt.Printf("%d入队->", i)
		}
	}
	fmt.Println("----------------------------")
	fmt.Println("当前队列长度:", queue.Len())
	fmt.Println("当前队列是否已满?", queue.IsFull())
	fmt.Println("----------------------------")
	for i := 0; i < 12; i++ {
		if v, err := queue.Out(); err != nil {
			fmt.Println("出队列失败,错误信息:", err)
		} else {
			fmt.Printf("%d出队->", v)
		}
	}
}


/*
 *
 * 具体实现
 *
 */

const MAX = 10

type Queue struct {
	len        int      //队列长度
	head, tail int      //头尾指针位置
	arr        [MAX]int //实际队列元素存在的固定长度数组
}

func (q *Queue) In(x int) error {
	if q.len == MAX {
		return errors.New("队列已满")
	}
	q.arr[q.tail] = x   //入队将元素插入到队尾指针处
	q.tail++            //队尾指针向后移位
	if q.tail > MAX-1 { //如果队尾指针大于数组边界,则队尾指针指回0
		q.tail = 0
	}
	q.len++ //队列长度+1
	return nil
}

func (q *Queue) Out() (int, error) {
	if q.len == 0 {
		return 0, errors.New("队列已空")
	}
	x := q.arr[q.head]  //出队时将队头指针出位置元素出队
	q.head++            //同时,对头指针向后移一位
	if q.head > MAX-1 { //如果队头指针大于数组边界,则队头指针指回0
		q.head = 0
	}
	q.len-- //队列长度-1
	return x, nil
}

func (q *Queue) Len() int {
	return q.len
}

func (q *Queue) IsFull() bool {
	if q.len < MAX {
		return false
	}
	return true
}

可能会有人说为什么结构体里的字段不大写。

因为对于我们自己封装的结构体来说,并不希望别人(调用方)知道内部封装的字段,只需要提供对应的方法给调用方使用就行。这也是对我们自己的结构体的保护。试想,你肯定不希望调用者直接修改你的队列长度吧,直接修改队列长度是不合理的。


总结

每一次面试都是对自我知识的查漏补缺,面试前多准备,面试后多复盘,机会是留给有准备的人的。另外,就算是面试的时候代码没运行出来,也一定要把思路说出来,有加分的。

最后,希望大家都拿到自己心仪的offer,也包括我(Offer+1,Offer+1,Offer+1,Offer+1……)

关注我,我会把这次面试经历做一个总结发出来,大家一起进大厂。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值