Skip to content

华为秋招笔试

  1. 有一个数组,代表网络的抽象。其中元素正值表示该位置是安全的或者有正面的安全措施,负值表示存在潜在的风险或威胁。从位置 0 开始,每一步可以前进最多 k 步,但不能超过数组边界。求最终累计的安全评分最大值。

    🔍 展开代码
    1.js
    js
    const 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]));
  2. 找到小于当前数字的最大稳定算力档,且该整数的所有数位上数字只和为质数。最大稳定算力档的定义为,从左到右每一位数字不小于前一位数字。

    🔍 展开代码
    2.js
    js
    const 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);
  3. 给定一个代表机房内 CDN 节点建设的数组,再给定覆盖范围 r 和新建数量 k。新建 k 个节点,使得服务质量最高,最后返回最小服务质量。

    🔍 展开代码
    3.js
    js
    const 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);