一、题目描述
疫情期间课堂的座位进行了特殊的调整,不能出现两个同学紧挨着,必须隔至少一个空位。
给你一个整数数组 desk
表示当前座位的占座情况,由若干 0
和 1
组成,其中 0
表示没有占位,1
表示占位。在不改变原有座位秩序情况下,还能安排坐几个人?
输入描述
第一行是个子数组表示作为占座情况,由若干 0
和 1
组成,其中 0
表示没有占位,1
表示占位
10000010
输出描述
2
输出数值表示还能坐几个人
二、解题思路
使用贪心算法。遍历数组,在遍历过程中,采取贪心的思路,并不需要【每个位置】都去查看是否可以坐下。若当前位置已经有人坐下,则后一个位置明显不能坐下,可以跳过去;若当前位置没有人坐下,则需要考虑该位置两侧座位情况。
三、详细代码
def max_audience(seats):
'''
:param seats: 某排座位落座情况,一维数组
:return: 还能落座的座位数
'''
max_audience = 0
i = 0
# 遍历整排座位落座情况
while i < len(seats):
# 某座位无人,则判断其两侧座位情况
if seats[i] == 0:
# 对于该位置左右两边的位置情况用bool值表示
is_left_empty = i == 0 or seats[i - 1] == 0 # 考虑最左边边界位置
is_right_empty = len(seats) - 1 or seats[i + 1] == 0 # 考虑最右边边界位置
# 该座位两侧座位均是空位时,可落座人数加1,更新该座位情况,
if is_left_empty and is_right_empty:
max_audience += 1
seats[i] == 1
i += 1 # 此时的i用来表明'间隔'落座,所以一位置落座之后,下一位置判断可直接跳过
# 此时的i用来遍历整个数组
i += 1
return max_audience
def main():
seats = list(map(int, input().strip()))
max_audience_count = max_audience(seats)
print(max_audience_count)
if __name__ == "__main__":
main()
四、不熟悉的地方
strip()和split()的区别
seats = list(map(int, input().strip()))
seats_1 = list(map(int, input().split()))
print(seats)
print(seats_1)
运行结果
#输入
10001
10001
#输出
[1, 0, 0, 0, 1]
[10001]
如果想用split()达到同样的效果,则输入需要改成
10001
1 0 0 0 1
运行结果
[1, 0, 0, 0, 1]
[1, 0, 0, 0, 1]