Skip to content

饿了么前端秋招笔试

  1. 一个数各个数位的 GCD 刚好也能被这个数本身整除,这种数字被定义为“好数字”,求给定的数组里有多少个“好数字”?没什么难度

    🔍 展开代码
    1.js
    js
    const rl = require("readline").createInterface({ input: process.stdin });
    const inputs = [];
    rl.on("line", (line) => inputs.push(line));
    rl.on("close", () => {
      const queryTimes = +inputs[0];
      for (let i = 1; i < inputs.length; i += 2) {
        const n = +inputs[i];
        const nums = inputs[i + 1].split(" ").map(Number);
        const result = findGood(n, nums);
        console.log(result);
      }
    });
    
    function findGood(n, nums) {
      let answer = 0;
      for (let i = 0; i < n; i++) {
        const curNum = nums[i];
        if (curNum < 10) {
          answer++;
          continue;
        }
        // 不是个位数的情况
        const numArr = Array.from("" + curNum).map(Number);
        const gcd = generateGCD(numArr);
        if (curNum % gcd === 0) answer++;
      }
      return answer;
    }
    
    function generateGCD(numArr) {
      let res = 1;
      for (let i = 2; i < 10; i++) {
        res = numArr.every((n) => n % i === 0) ? i : res;
      }
      return res;
    }
  2. 长度为 n 的字符串 str 任意修改 k 个位置以后最长的相同字母连续子串。没想到滑动窗口

    🔍 展开代码
    2.js
    js
    const rl = require("readline").createInterface({ input: process.stdin });
    const inputs = [];
    rl.on("line", (line) => inputs.push(line));
    rl.on("close", () => {
      const [n, k] = inputs[0].split(" ").map(Number);
      const str = inputs[1];
      console.log(deal(n, k, str));
    });
    
    function deal(n, k, str) {
      // 长度为 n 的字符串 str 任意修改 k 个位置以后最长的相同字母连续子串
    
      let maxLength = 0;
    
      // 对每个可能的字符(a-z)都尝试一次
      for (let targetChar = 0; targetChar < 26; targetChar++) {
        const char = String.fromCharCode(97 + targetChar); // 'a' + targetChar
    
        let left = 0,
          right = 0;
        let changesNeeded = 0;
    
        // 滑动窗口
        while (right < n) {
          // 扩展右边界
          if (str[right] !== char) {
            changesNeeded++;
          }
    
          // 收缩左边界,直到修改次数不超过k
          while (changesNeeded > k) {
            if (str[left] !== char) {
              changesNeeded--;
            }
            left++;
          }
    
          // 更新最大长度
          maxLength = Math.max(maxLength, right - left + 1);
          right++;
        }
      }
    
      return maxLength;
    }
    
    // 测试
    console.log(deal(4, 2, "abcd")); // 3
    console.log(deal(5, 2, "abacc")); // 4
    console.log(deal(8, 1, "aaaacaaa")); // 8
  3. 给定一个数组 nums,nums 有多少个子序列在 Fibonacci 序列中。Claude 懵逼了

    🔍 展开代码
    3.js
    js
    const rl = require("readline").createInterface({ input: process.stdin });
    const inputs = [];
    rl.on("line", (line) => inputs.push(line));
    rl.on("close", () => {
      for (let i = 1; i < inputs.length; i += 2) {
        const n = +inputs[i];
        const nums = inputs[i + 1].split(" ").map(Number);
        // nums 有多少个子序列在 Fibonacci 序列中
        console.log(deal(n, nums));
      }
    });
    function deal(n, nums) {}
    
    console.log(deal(3, [1, 1, 1])); // 6 [1]*3 [1,1]*2
    console.log(deal(4, [1, 1, 2, 3])); // 15
    // [1]*2 [2]*1 [3]*1
    // [1,1]*1 [1,2]*2 [1,3]*2 [2,3]*1
    // [1,1,2]*1 [1,2,3]*2 [1,1,3]*1
    // [1,1,2,3]*1