这道题当看到example2的N=100000000时,就应该意识到状态肯定会循环重复。只要记录每次的状态,直到检测到状态重复时,就可以算出循环起始位置和循环长度。

pos = (N - periodStart) % period + periodStart
var prisonAfterNDays = function(cells, N) {
    const len = cells.length;
    if (len === 0 || N === 0) {
        return [];
    }

    const map = {[cells.join('')]: 0};
    const states=  [cells];
    let i = 1;
    let period = 0;
    let periodStartPos = 0;
    while (true) {
        const nextState = getNextCell(cells);
        const nextStateStr = nextState.join('');
        if (nextStateStr in map) {
            periodStartPos = map[nextStateStr];
            period = states.length - map[nextStateStr];
            break;
        } else {
            map[nextStateStr] = i;
        }
        states.push(nextState);
        cells = nextState;
        i++;
    }
    return states[(N-periodStartPos) % period + periodStartPos];
};

function getNextCell(cells) {
    const len = cells.length;
    const next = new Array(len);
    next[0] = 0; 
    next[len-1] = 0;
    for (let i = 1; i< len-1; i++) {
        if (cells[i-1] === cells[i+1]) {
            next[i] = 1;
        } else {
            next[i] = 0;
        }
    }
    return next;
}

results matching ""

    No results matching ""