某大厂二面编程题-用固定长度数组模拟队列实现
前言
刚面完某大厂二面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……)
关注我,我会把这次面试经历做一个总结发出来,大家一起进大厂。

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

被折叠的 条评论
为什么被折叠?



