题目:
8 间牢房排成一排,每间牢房不是有人住就是空着。
每天,无论牢房是被占用或空置,都会根据以下规则进行更改:
- 如果一间牢房的两个相邻的房间都被占用或都是空的,那么该牢房就会被占用。
- 否则,它就会被空置。(请注意,由于监狱中的牢房排成一行,所以行中的第一个和最后一个房间无法有两个相邻的房间。)
我们用以下方式描述监狱的当前状态:如果第 i 间牢房被占用,则 cell[i]==1,否则 cell[i]==0。
根据监狱的初始状态,在 N 天后返回监狱的状况(和上述 N 种变化)。
var prisonAfterNDays = function(cells, N) {
var cellList = [];
for(var i = 0;i<N;i++){
cellList.push([].concat(cells));
prisonChange(cells);
if(cellList.some((list)=>{
for(let j = 0;j<cells.length;j++){
if(cells[j]!==list[j]){
return false;
}
}
cellList = cellList.splice(cellList.indexOf(list))
return true;
})){
break;
}
}
if(N===i)
return cells;
else{
return cellList[((N-i-1) % cellList.length)]
}
};
var prisonChange = function(cells){
var tempCell = JSON.parse(JSON.stringify(cells));
for( var i =0;i<cells.length;i++){
if(i===0|| i===cells.length -1){
cells[i] = 0;
}else{
cells[i] = tempCell[i-1]-tempCell[i+1] === 0? 1:0;
}
}
}
咋一看很简单的题目,一提交以后直接TLE了。
原因就在于这题不能暴力循环N次,可以想象的出这样的题目肯定是有规律的,只要把有规律的那部分找出来就行了,一旦发现有曾经出现过的数组,直接取子串即可。
最快的方法直接把循环次数固定到了14次,虽然情况也是如此,不过不知道他们怎么算出来的。
我这边就还是先算,直到算出重复的,通过slice获取重复数组,取余以后从重复数组里拿出。