定义变形的杨辉三角规则:
∙第一行为固定的整数 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]);
}
}()