面试官给我一道选座位题,我懵了
上周参加一场面试,面试官问了我一道选座位的问题,要从4*4或者3*3的座位中,实现一个函数,输入一个数字n,系统自动匹配n连座的座位,并返回回去
简单的说了下我的思路,面试官意犹未尽,让我花10分钟在黑板上写代码
离开ide的代码能力...基本为零,思索稍后,实在憋不出来
直接说了,写不出来...
回到正题
那到底该怎么实现这个功能呢?
目标
要求:函数输入一个人数,系统自动分配相邻的座位给到用户
比如输入一个数字2,返回黄色方块的两个相邻的位置给到用户
理清需求
1.座位存在两种状态已售出和未售出,已售出的用1标记,未售出的用0标记
2.记录每一行座位的连座的最大容量,因此要增加一列来记录
3.选座位进行时,对座位进行遍历,判断是否符合最大容量要求,比如我输入3,肯定会跳过第二行
代码实现
package main import ( "fmt" "math" ) type Seats struct { row int col int s [][]int cap int } func New(row, col int) *Seats { s := make([][]int, row) for i := 0; i < col; i++ { s[i] = make([]int, col) } for i := 0; i < row; i++ { for j := 0; j < col; j++ { s[i][j] = 1 } s[i] = append(s[i], col) } return &Seats{row,col,s, col*row} } type entry struct { x int y int } func (s *Seats) People(n int) []entry{ var result []entry if n > s.cap { return result } if n <= s.col { return s.Search(n) } if n > s.col { snum := math.Floor(float64(n / s.col)) for i := 0; i < int(snum); i++ { result = append(result, s.Search(s.col)...) } result = append(result, s.Search(n % s.col)...) } return result } func (s *Seats) Search (n int) []entry { if n > s.col { return []entry{} } var result []entry for i := 0; i < s.row; i++ { if s.s[i][len(s.s)] < n { continue } else { for j := 0; j < s.col; j++ { if s.s[i][j] == 1 { result = append(result, entry{i, j}) s.s[i][j] = 0 n-- s.cap-- s.s[i][len(s.s)]-- if n == 0 { break } } } break } } return result } func main() { seats := New(4, 4) fmt.Println(seats.s) r := seats.People(4) w := seats.People(5) fmt.Println(seats.s) fmt.Println(r) fmt.Println(w) }
代码实现思路
1.返回一个切片是一个entry,包含行号和列号
2.初始化座位的时候,全部都是标记为1
3.选座位(Search)的时候,先与最大容量比对,不符合就进行下一行比对
上一篇:
Java基础知识总结(2021版)