【简单】算法nodeJs:杨辉三角的变形

287 阅读2分钟

定义变形的杨辉三角规则:
∙第一行为固定的整数 1;
∙第二行开始,每行的数字数量均比上一行多两个,且中心对称(也可以看作是在上一行的基础上首尾增加了一个数字);每个位置上的数字是它正上方、左上角和右上角这三个数之和(如果不存在某个数,认为该数就是 0)。
下方展示了计算的过程:

现在,你需要输出第 n 行中第一个偶数出现的位置。从 1 开始计数。

输入描述:

输入一个整数 n(1≦n≦109) 代表询问的行数。

输出描述:

输出一个整数,代表第 n 行中第一个偶数出现的位置。特别地如果第 n 行中没有偶数,则输出 −1。

这是我最初最无脑的想法直接循环

const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
    // Write your code here
    while ((n = await readline())) {
        n = n - 0;//输入的行数
        if (n === 1) {
            return console.log(-1);
        } else {
            const m = (n - 1) * 2 + 1;//列数
            const arr = [];
            for (let i = 0; i < n; i++) {
                arr[i] = [];//二维数组
                for (let j = 0; j < m; j++) {
                    if (i === 0 && j === (m - 1)/2) {
                        arr[i][j] = 1;//确定第一行1的位置
                    } else if (i === 0 && j !== (m - 1)/2) {
                        arr[i][j] = 0;//第一行其余位置置0
                    } else {
                        //计算出其他行坐标的值
                        if (j === 0) {
                            arr[i][j] = arr[i - 1][j] + arr[i - 1][j + 1];
                        } else if (j === n) {
                            arr[i][j] = arr[i - 1][j - 1] + arr[i - 1][j];
                        } else {
                            arr[i][j] =
                                arr[i - 1][j - 1] +
                                arr[i - 1][j] +
                                arr[i - 1][j + 1];
                        }
                    }
                }
            }
            const narr = arr[n - 1];//找到第n行的数组
            // console.log(narr);
            let result = -1;
            for (let i = 0; i < narr.length; i++) {
                if (narr[i] % 2 === 0) {
                    result = i+1;
                    break;
                }
            }

            console.log(result);
        }
    }
})();

但是!!!这个程序如果行数过大会把内存搞崩。

经过前期递归测试一些数据发现有以下规律 从第三个开始 重复 2 3 2 4的规律

找到规律后对代码直接推翻重改

const rl = require("readline").createInterface({ input: process.stdin });

var iter = rl[Symbol.asyncIterator]();

const readline = async () => (await iter.next()).value;

  
void async function () {

    const line = await readline();

    if(line < 3) {

        console.log(-1)

    } else {

        let arr = [4,2,3,2];

        const idx = (line - 2) % 4;//直接求余就是arr索引位置

        console.log(arr[idx]);

    }

}()