Skip to content

作业帮秋招笔试

  1. Promise 链中,如果某一个 .then 没有返回值,那么下一个 .then 接收到的数据是:

  2. ipv6 由 32 个地址空间变成了:

  3. 传入一个数字,转换成 xxxB/xxxKB/xxxMB/xxxGB 的格式。保留一位小数,除非小数位为 0。

    🔍 展开代码
    1.js
    js
    const rl = require("readline").createInterface({ input: process.stdin });
    const inputs = [];
    rl.on("line", (line) => inputs.push(line));
    rl.on("close", () => {
      const line = +inputs[0];
      const result = deal(line);
      console.log(result);
    });
    
    function deal(line) {
      const B_LIMIT = 1024;
      const KB_LIMIT = 1024 * B_LIMIT;
      const MB_LIMIT = 1024 * KB_LIMIT;
      const GB_LIMIT = 1024 * MB_LIMIT;
    
      if (line < B_LIMIT) return `${line}B`;
      else if (line < KB_LIMIT) {
        const kb = line / B_LIMIT;
        return `${line % B_LIMIT ? kb.toFixed(1) : kb}KB`;
      } else if (line < MB_LIMIT) {
        const mb = line / KB_LIMIT;
        return `${line % KB_LIMIT ? mb.toFixed(1) : mb}MB`;
      } else {
        const gb = line / MB_LIMIT;
        return `${line % MB_LIMIT ? gb.toFixed(1) : gb}GB`;
      }
    }
  4. 分两行接收输入,第一行是一系列版本号,第二行是一个版本号,判断版本号数组里有哪些版本做到兼容。

    🔍 展开代码
    2.js
    js
    const rl = require("readline").createInterface({ input: process.stdin });
    const inputs = [];
    rl.on("line", (line) => inputs.push(line));
    rl.on("close", () => {
      const versions = inputs[0].split(" ");
      const standard = inputs[1];
      const results = versions.filter((v) => check(v, standard));
      console.log(results.join(" "));
    });
    
    function check(version, standard) {
      const number_standard = +standard;
      const isNumber = !Number.isNaN(number_standard);
      if (isNumber) {
        const arr_s = standard.split(".");
        const arr_v = version.split(".");
        let i = 0;
        while (i < arr_s.length && i < arr_v.length) {
          const cur_s = arr_s[i];
          const cur_v = arr_v[i];
          if (cur_s === cur_v) i++;
          else return false;
        }
        return true;
      } else {
        // 这里只是判断了主版本号相同或者主版本号、次版本号相同
        // 实际上应该还要判断是否是 standard 之后的版本号
        if (standard.startsWith("^")) {
          const arr_s = standard.slice(1).split(".");
          const arr_v = version.split(".");
          return arr_s[0] === arr_v[0];
        } else {
          const arr_s = standard.slice(1).split(".");
          const arr_v = version.split(".");
          return arr_s[0] === arr_v[0] && arr_s[1] === arr_v[1];
        }
      }
    }
    
    // 下面给一个更完整的代码
    function check(version, standard) {
      // 数字形式,比如 "1.2.3"
      const number_standard = +standard;
      const isNumber = !Number.isNaN(number_standard);
      if (isNumber) {
        const arr_s = standard.split(".");
        const arr_v = version.split(".");
        let i = 0;
        while (i < arr_s.length && i < arr_v.length) {
          if (arr_s[i] !== arr_v[i]) return false;
          i++;
        }
        return true;
      } else {
        const arr_s = standard.slice(1).split(".").map(Number);
        const arr_v = version.split(".").map(Number);
    
        if (standard.startsWith("^")) {
          // ^x.y.z  -> 主版本相同 && 版本 >= x.y.z
          if (arr_s[0] !== arr_v[0]) return false;
          return compareVersion(arr_v, arr_s) >= 0;
        } else if (standard.startsWith("~")) {
          // ~x.y.z -> 主版本相同 && 次版本相同 && 修订号 >= z
          if (arr_s[0] !== arr_v[0] || arr_s[1] !== arr_v[1]) return false;
          return compareVersion(arr_v, arr_s) >= 0;
        } else {
          return false; // 其他情况不处理
        }
      }
    }
    
    // 比较两个版本号 [major, minor, patch]
    // v1 >= v2 -> 返回 1
    // v1 == v2 -> 返回 0
    // v1 < v2  -> 返回 -1
    function compareVersion(v1, v2) {
      for (let i = 0; i < 3; i++) {
        const diff = (v1[i] || 0) - (v2[i] || 0);
        if (diff > 0) return 1;
        if (diff < 0) return -1;
      }
      return 0;
    }