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、结果截图
