解题思路
本题用长度为 n 的数组模拟格口状态,下标 0 对应 1 号格。数组值 0 表示空,正整数表示餐的重量。
各接口都先做边界检查,再改状态:
- put:编号合法、重量为正、该格为空才写入。
- take:合法且非空才清空并返回原重量,否则返回 0。
- moveRight:源格非空且不是最右格、右侧为空才搬家。
题目内容
小区门口有一面外卖格口墙,从左到右共 n 个格口,编号 1 到 n。每个格口最多放一份餐:空格记重量 0,有餐则记下正整数重量。值班师傅只允许把餐挪到右边相邻的空格,不能往左搬,也不能覆盖已占用的格口。
请实现类 ParcelSlots:
- ParcelSlots(n):建一面有 n 个空格的墙。
- put(i,w):往第 i 格放入重量 w 的餐。
- 若 i 越界、w≤0,或该格已占用,返回 false,不改动
- 否则放入成功,返回 true
- take(i):取出第 i 格的餐。
- 若 i 越界或该格为空,返回 0
- 否则清空该格,返回被取出的重量
- moveRight(i):把第 i 格的餐挪到第 i+1 格。
- 若 i 越界、i=n、第 i 格为空、或第 i+1 格已占用,返回 false,不改动
- 否则挪成功,返回 true
- occupied():返回当前被占用的格口数量
说明:
- 格口编号从 1 开始
- take 成功后该格变空,之后可以再 put
- 不提供往左挪、隔格挪或合并重量的接口
约束:累计调用 ≤2000;1≤n≤200;1≤i≤106(越界由对应接口判失败);重量合法范围 1≤w≤104(非法由 put 返回失败)。
输入描述
每行一次函数调用,首行必为 ParcelSlots(n)。
输出描述
每次调用一行:
- 构造输出 null
- put / moveRight 输出 true / false
- take / occupied 输出整数
样例1
输入:
ParcelSlots(3)
put(1, 5)
put(1, 8)
put(2, 0)
put(3, 4)
occupied()
moveRight(1)
take(2)
take(2)
moveRight(3)
occupied()
输出:
null
true
false
false
true
2
true
5
0
false
1
说明:
- put(1,5) 成功;再往同一格 put(1,8) 失败
- put(2,0) 重量非法,失败
- put(3,4) 成功,此时占用 2 格
- moveRight(1) 把 1 号的餐挪到空着的 2 号
- take(2) 取出重量 5;再取一次得到 0
- 3 号已是最右格,moveRight(3) 失败
- 还剩 3 号一份餐,占用数为 1
样例2
输入:
ParcelSlots(1)
put(2, 3)
take(1)
moveRight(1)
put(1, 9)
moveRight(1)
occupied()
输出:
null
false
0
false
true
false
1
说明:只有 1 个格口。越界放入失败;空格取出为 0;最右格无法右移;放入成功后占用数为 1。