用Python编写查找k天后囚室状态的程序
假设我们有一个二进制列表(列表中的1和0)和另一个值k。其中nums中的每个值表示一间监狱的状态,其中1表示占用,0表示空置。当一个单元格有两个相邻单元格同时为空或占用时,它将变为占用状态。否则,它将变为空置的。因此,我们要找到k天之后囚室的状态。
因此,如果输入为nums = [1, 0, 1, 0, 0, 0, 0, 0] k = 1, 则输出为[0, 1, 1, 0, 1, 1, 1, 0],因为我们可以注意到第一个和最后一个索引永远不能被占用,因为它们永远不能有2个邻居。
为了解决这个问题,我们将采取以下步骤:
- 定义函数next_day_state()。这将以单元格为输入。
- new_cells:单元格的副本
- new_cells [0]=0,new_cells [7]=0
- 对于范围在1到6之间的j,执行以下操作:
- 如果cells [j-1]与cells [j + 1]相同,则
- new_cells[j]:= 1
- 否则,
- new_cells[j]:= 0
- 如果cells [j-1]与cells [j + 1]相同,则
- 返回new_cells
- 从main方法执行以下操作:
- seen:=一个新的映射
- flag:=False, i:=0
- 当i小于N时,执行以下操作:
- ns:=next_day_state(cells)
- 如果没有看见ns,则
- 将ns标记为已看过
- 否则,
- flag:=True
- 从循环中退出
- cells:=ns
- i:=i+1
- 如果flag为true,则
- N:=N mod(已观察到的项数)
- i:=0
-
当i
- ns:=next_day_state(cells)
- i:=i+1
- cells:=ns
-
返回cells
让我们看以下实现以更好地理解:
更多Python相关文章,请阅读:Python 教程
示例
import copy
class Solution:
def next_day_state(self, cells):
new_cells = copy.copy(cells)
new_cells[0] = 0
new_cells[7] = 0
for j in range(1, 7):
if cells[j - 1] == cells[j + 1]:
new_cells[j] = 1
else:
new_cells[j] = 0
return new_cells
def solve(self, cells, N):
seen = dict()
flag, i = False, 0
while i < N:
ns = self.next_day_state(cells)
if tuple(ns) not in seen:
seen[tuple(ns)] = True
else:
flag = True
break
cells = ns
i += 1
if flag:
N = N % len(seen)
i = 0
while i < N:
ns = self.next_day_state(cells)
i += 1
cells = ns
return cells
ob = Solution()
nums = [1, 0, 1, 0, 0, 0, 0, 0]
k = 1
print(ob.solve(nums, k))
输入
[4, 7, 2, 5], 6
输出
[0, 1, 1, 0, 1, 1, 1, 0]