N 天后的牢房 |刷题打卡

335 阅读1分钟

题目

8 间牢房排成一排,每间牢房不是有人住就是空着。

每天,无论牢房是被占用或空置,都会根据以下规则进行更改:

如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用。 否则,它就会被空置。 (请注意,由于监狱中的牢房排成一行,所以行中的第一个和最后一个房间无法有两个相邻的房间。)

我们用以下方式描述监狱的当前状态:如果第 i 间牢房被占用,则 cell[i]==1,否则 cell[i]==0。

根据监狱的初始状态,在 N 天后返回监狱的状况(和上述 N 种变化)。

示例:

输入:cells = [0,1,0,1,1,0,0,1], N = 7
输出:[0,0,1,1,0,0,0,0]
解释:
下表概述了监狱每天的状况:
Day 0: [0, 1, 0, 1, 1, 0, 0, 1]
Day 1: [0, 1, 1, 0, 0, 0, 0, 0]
Day 2: [0, 0, 0, 0, 1, 1, 1, 0]
Day 3: [0, 1, 1, 0, 0, 1, 0, 0]
Day 4: [0, 0, 0, 0, 0, 1, 0, 0]
Day 5: [0, 1, 1, 1, 0, 1, 0, 0]
Day 6: [0, 0, 1, 0, 1, 1, 0, 0]
Day 7: [0, 0, 1, 1, 0, 0, 0, 0]

示例二:

输入:cells = [1,0,0,1,0,0,1,0], N = 1000000000
输出:[0,0,1,1,1,1,1,0]

提示:

  1. cells.length == 8
  2. cells[i] 的值为 0 或 1
  3. 1 <= N <= 10^9

解体思路

在仔细阅读,我们了解到celles的长度会永远为8,并且我们N次变化之后的值左右两侧肯定为O

意思就是我们N次之后的变化肯定是为[0,?,?,?,?,?,?,0]。 很多人在确认8位之后后,会14位为一个单位的集合。这里可能需要我2刷才能明白,为什么14位才是一个集合~。这里给大家摘子一个来自code的答疑

那不知道14为一个集合,我们就不能算出来结果嘛?当然不会的,我们不知道这个周期的位数是几,但是我们知道肯定会有一个周期的。

ok,接下里在编码中为大家体现

/**
 * @param {number[]} cells
 * @param {number} N
 * @return {number[]}
 */
function prisonAfterNDays(cells, N) {
  const list = []; // 声明一个用于承接周期的数组;

  for (let i = 0; i < N; i++) {
    const arr = []; // 声明一下在每次变化之后的数组
    for (let j = 0; j < cells.length; j++) {
      // 在首位以及最后一位肯定为0
      if (j === 0 || j === cells.length - 1) {
        arr[j] = 0;
      } else if (cells[j - 1] === cells[j + 1]) {
        arr[j] = 1;
      } else {
        arr[j] = 0;
      }
    }
    cells = arr; // 记录每次变化后的值,覆盖上次的值
    // 判断是不是已经到一个周期了
    if (i > 1 && arr.join('') === list[0].join('')) {
      break;
    }
    list.push(arr); // 将每次变化后的值push进周期数组,直到找到整个周期
  }
  const idx = N % list.length; // 取余,判断应取周期中的哪一位
  return idx === 0 ? list.pop() : list[idx - 1];
}

”本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情