• 957. Prison Cells After N Days


    There are 8 prison cells in a row, and each cell is either occupied or vacant.

    Each day, whether the cell is occupied or vacant changes according to the following rules:

    • If a cell has two adjacent neighbors that are both occupied or both vacant, then the cell becomes occupied.
    • Otherwise, it becomes vacant.

    (Note that because the prison is a row, the first and the last cells in the row can't have two adjacent neighbors.)

    We describe the current state of the prison in the following way: cells[i] == 1 if the i-th cell is occupied, else cells[i] == 0.

    Given the initial state of the prison, return the state of the prison after N days (and N such changes described above.)

     

    Example 1:

    Input: cells = [0,1,0,1,1,0,0,1], N = 7
    Output: [0,0,1,1,0,0,0,0]
    Explanation: 
    The following table summarizes the state of the prison on each day:
    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]
    
    

    Example 2:

    Input: cells = [1,0,0,1,0,0,1,0], N = 1000000000
    Output: [0,0,1,1,1,1,1,0]
    class Solution {
        public int[] prisonAfterNDays(int[] cells, int N) {
            Set<String> set = new HashSet();
            int cycle = 0;
            boolean hascyc = false;
            for(int i = 1; i <= N; i++){
                int[] next = help(cells);
                String s = Arrays.toString(next);
                if(set.contains(s)){
                    hascyc = true;
                    break;
                }
                else{
                    cycle++;
                    set.add(s);
                }
                cells = next;   
            }
            if(!hascyc) return cells;
            else{
                N %= cycle;
                for(int i = 0; i < N; i++){
                    cells = help(cells);
                }
                return cells;
            }
        }
        public int[] help(int[] cells){
            int[] next = new int[cells.length];
            for(int i = 1; i < cells.length - 1; i++){
                next[i] = cells[i-1] == cells[i+1] ? 1: 0;
            }
            return next;
        }
    }

    simulating,

    先读题,一个cell左边右边是相同状态下一次这个cell就是1,否则是0

    因为只有8个cell,充其量就2^8 == 256种,超过了肯定有循环

    用hashset判断有无循环,有就把N mod变小,重新call help方法即可

  • 相关阅读:
    Core Animation笔记(变换)
    Core Animation笔记(- Layer 基本属性)
    使用AndroidStudio编写APICloud模块需要注意的地方,解决模块未定义。
    MAC中使用APICloud同步代码错误解决办法
    【深入理解Java虚拟机 】类加载器的命名空间以及类的卸载
    【深入理解Java虚拟机 】类的加载器
    【深入理解Java虚拟机】类的初始化过程
    Netty中ByteBuf的引用计数线程安全的实现原理
    Java使用PipedStream管道流通信
    Java中的守护线程
  • 原文地址:https://www.cnblogs.com/wentiliangkaihua/p/13233687.html
Copyright © 2020-2023  润新知