LeetCode 957. N 天后的牢房

2019-06-21  本文已影响0人  风卷晨沙

1、题目

https://leetcode-cn.com/problems/prison-cells-after-n-days/

2、题解

看到这道题目,我首先想到的是直接按照所给的条件进行判断就行了。
也就是满足:

newResult[i-1]==newResult[i+1]

这样的确是可以得到第一遍的结果。
可是至此只是完成了一半。
还要将得到的结果作为下一次判断时的对象数组,所以需要将这次的结果保留下来。
由此我第一个想到的就是类似递归的写法。用一个方法来不断的输出结果,又用结果来作为下次的输入参数。
这种写法,比我之前看到的存在map里面的方法要聪明一点。(自以为是,哈哈)
并在指定次数的情况下进行循环,得到最终结果。
由于这道题是每14一个循环,所以我们用N对14取余就可以得到循环的次数,但需要注意的是,单纯的取余是不行的,因为到14的倍数的时候取余为0。会得到错误的结论。需要写一个三元表达式来判断一下。

3、代码

 class Solution {
           int[] nowResult=new int[8];
        public int[] prisonAfterNDays(int[] cells, int N) {
            //由于这道题是每14一个循环;
            //那么我们取余即可;
            int loopNum = N % 14==0?14:N % 14;
            for (int i = 0; i <loopNum ; i++) {
                if(i==0){
                     nowResult= getNowResult(cells);
//                    return nowResult;
                }else {
                    nowResult=getNowResult(nowResult);
                }
            }
            return nowResult;

        }

        public int[] getNowResult(int[] cells){
            //1 <= N <= 10^9

            int length = cells.length;//8
            int[] result=new int[cells.length];
                for (int i = 0; i <length ; i++) {
                    //对每一个进行判断
                    //边缘判断
                    if(i==0||i==length-1){
//                        cells[i]=0;
                        result[i]=0;
                    }else if(cells[i-1]==cells[i+1]){
                        //中间
//                        cells[i]=1;
                        result[i]=1;
                    }else{
//                        cells[i]=0;
                        result[i]=0;
                    }
                }


            return result;
        }
    }

4、结果截图

image.png
上一篇 下一篇

猜你喜欢

热点阅读