Skip to content

滴滴秋招笔试

  1. 给定一份路线字符串,最少修改几个字符能保证回到起点?通过

    🔍 展开代码
    1.js
    js
    const rl = require("readline").createInterface({
      input: process.stdin,
    });
    const inputs = [];
    rl.on("line", (line) => {
      inputs.push(line);
    });
    rl.on("close", () => {
      const str = inputs[0];
      let hori = 0;
      let vert = 0;
      for (const s of str) {
        if (s === "L") hori++;
        else if (s === "R") hori--;
        else if (s === "U") vert++;
        else vert--;
      }
      hori = Math.abs(hori);
      vert = Math.abs(vert);
      res = Math.floor(hori / 2) + Math.floor(vert / 2) + (hori % 2 === 1 ? 1 : 0);
      console.log(res);
    });
  2. 给定 n 个居民,m 套房源,V 份补贴。怎么样分配房源能保证无房居民的数量最少?整体思路没问题,笔试有点小瑕疵没过

    🔍 展开代码
    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, m, v] = inputs[0].split(" ").map(Number);
      const pressures = inputs[1].split(" ").map(Number);
      const prices = inputs[2].split(" ").map(Number);
      const result = deal(n, m, v, pressures, prices);
      console.log(result);
    });
    
    function deal(n, m, v, pressures, prices) {
      pressures.sort((a, b) => a - b);
    
      // 房子价格 -> 数量
      const map = new Map();
      for (const p of prices) {
        map.set(p, (map.get(p) || 0) + 1);
      }
    
      // 从剩余房源中分配
      const distribute = (pressure) => {
        const smaller = [...map.keys()].filter((p) => p <= pressure);
        if (smaller.length) {
          return Math.max(...smaller); // 选最大的不超过 pressure
        }
    
        // 否则选剩余的最小价格
        let minPrice = Infinity;
        for (const [p, cnt] of map) {
          if (cnt > 0) minPrice = Math.min(minPrice, p);
        }
        return minPrice;
      };
    
      let res = n;
    
      for (const cur of pressures) {
        if (map.size === 0) break; // 没房子了
    
        const house = distribute(cur);
    
        if (!Number.isFinite(house)) break; // 无可用房
    
        if (house <= cur) {
          map.set(house, map.get(house) - 1);
          if (map.get(house) === 0) map.delete(house);
          res--;
        } else {
          const diff = house - cur;
          if (v >= diff) {
            v -= diff;
            map.set(house, map.get(house) - 1);
            if (map.get(house) === 0) map.delete(house);
            res--;
          }
        }
      }
      return res;
    }