华为秋招笔试
有一个数组,代表网络的抽象。其中元素正值表示该位置是安全的或者有正面的安全措施,负值表示存在潜在的风险或威胁。从位置 0 开始,每一步可以前进最多 k 步,但不能超过数组边界。求最终累计的安全评分最大值。
🔍 展开代码
jsconst rl = require("readline").createInterface({ input: process.stdin, }); const inputs = []; rl.on("line", (data) => { inputs.push(data); }); rl.on("close", () => { const k = +inputs[0]; const m = +inputs[1]; const arr = inputs[2].split(" ").map(Number); const result = deal(k, m, arr); console.log(result[result.length - 1]); }); function deal(k, m, arr) { const dp = Array.from({ length: m }, (_, index) => arr[index]); const stack = [0]; for (let i = 1; i < m; i++) { while (stack.length && stack[0] < i - k) { stack.shift(); } dp[i] = dp[stack[0]] + arr[i]; while (stack.length && dp[stack[stack.length - 1]] <= dp[i]) { stack.pop(); } stack.push(i); } return dp; } console.log(deal(2, 8, [3, -5, -10, 2, -1, 5, -6, -5]));找到小于当前数字的最大稳定算力档,且该整数的所有数位上数字只和为质数。最大稳定算力档的定义为,从左到右每一位数字不小于前一位数字。
🔍 展开代码
jsconst rl = require("readline").createInterface({ input: process.stdin, }); const inputs = []; rl.on("line", (data) => { inputs.push(data); }); rl.on("close", () => { const limit = +inputs[0]; const result = findNumber(limit); console.log(result); }); function findNumber(limit) { const _sushus = new Set([ 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, ]); for (let i = limit; i >= 2; i--) { const arr = Array.from("" + i); const sum = arr.reduce((pre, cur) => +cur + pre, 0); const flag1 = _sushus.has(sum); let flag2 = true; for (let j = 1; j < arr.length; j++) { if (arr[j] < arr[j - 1]) { flag2 = false; break; } } console.log(i, arr, sum, flag1, flag2); if (flag1 && flag2) return i; } return -1; } const result = findNumber(111); console.log(result);给定一个代表机房内 CDN 节点建设的数组,再给定覆盖范围 r 和新建数量 k。新建 k 个节点,使得服务质量最高,最后返回最小服务质量。
🔍 展开代码
jsconst rl = require("readline").createInterface({ input: process.stdin, }); const inputs = []; rl.on("line", (line) => inputs.push(line)); rl.on("close", () => { const [r, k, n] = inputs.slice(0, 3).map(Number); const cities = inputs[3].split(" ").map(Number); const result = solve(r, k, n, cities); console.log(result); }); function solve(r, k, n, cities) { const dp = Array.from({ length: n }, (_, index) => cities[index]); for (let i = 0; i < n; i++) { for (let j = 1; j <= r; j++) { if (i - j >= 0) dp[i] += cities[i - j]; if (i + j < n) dp[i] += cities[i + j]; } } // return Math.min(...dp) + k; let index = 0; let min = Infinity; for (let i = 0; i < n; i++) { if (cities[i] < min) { index = i; min = cities[i]; } } cities[index] += k; return Math.min(...dp); } const r1 = 0; const k1 = 3; const n1 = 4; const cities1 = [5, 5, 5, 5]; const result1 = solve(r1, k1, n1, cities1); console.log(result1); const r2 = 1; const k2 = 2; const n2 = 5; const cities2 = [1, 2, 4, 9, 3]; const result2 = solve(r2, k2, n2, cities2); console.log(result2);
