米哈游3/19前端笔试

过了全部用例,是并查集。求第三道'mhy'字符串的解法。

class Uf {
  constructor(n) {
    this.pre = new Array(n).fill().map((val, key) => key);
  }
  find(x) {
    if (x != this.pre[x]) {
      return (this.pre[x] = this.find(this.pre[x]));
    }
    return this.pre[x];
  }
  union(x, y) {
    let [xroot, yroot] = [this.find(x), this.find(y)];
    if (xroot == yroot) return;
    this.pre[xroot] = yroot;
  }
}
function mysol(n, m, arr) {
  let uf1 = new Uf(n * m); //正常人视角
  let uf2 = new Uf(n * m); //色盲视角
  let color, curid, leftid, topid;
  for (let i = 0; i < n; i++) {
    for (let j = 0; j < m; j++) {
      color = arr[i][j];
      curid = i * m + j;
      //正常人视角
      if (i - 1 >= 0 && arr[i - 1][j] == color) {
        //上边的那一个
        topid = (i - 1) * m + j;
        uf1.union(curid, topid);
      }
      if (j - 1 >= 0 && arr[i][j - 1] == color) {
        //左边那一个
        leftid = i * m + j - 1;
        uf1.union(curid, leftid);
      }

      //色盲视角
      if (color == "G" || color == "B") {
        //蓝绿
        if (i - 1 >= 0 && (arr[i - 1][j] == "G" || arr[i - 1][j] == "B")) {
          //上边的那一个
          topid = (i - 1) * m + j;
          uf2.union(curid, topid);
        }
        if (j - 1 >= 0 && (arr[i][j - 1] == "G" || arr[i][j - 1] == "B")) {
          //左边那一个
          leftid = i * m + j - 1;
          uf2.union(curid, leftid);
        }
      } else {
        //红色
        if (i - 1 >= 0 && arr[i - 1][j] == color) {
          //上边的那一个
          topid = (i - 1) * m + j;
          uf2.union(curid, topid);
        }
        if (j - 1 >= 0 && arr[i][j - 1] == color) {
          //左边那一个
          leftid = i * m + j - 1;
          uf2.union(curid, leftid);
        }
      }
    }
  }
  let count1 = 0,
    count2 = 0;
  for (let id = 0; id < uf1.size.length; id++) {
    if (uf1.find(id) == id) {
      count1 += 1; 
    }
    if (uf2.find(id) == id) {
      count2 -= 1;
    }
  }
  return count1 + count2;
}
// mysol(2, 6, [
//   ["R", "R", "G", "G", "B", "B"],
//   ["R", "G", "B", "G", "R", "R"],
// ]);
// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void (async function () {
  // Write your code here
  let line = await readline();
  let [n, m] = line.split(" ").map((val) => parseInt(val));
  let arr = [];
  for (var i = 0; i < n; i++) {
    lines = (await readline()).split("");
    arr.push(lines);
  }
  mysol(n, m, arr);
})();

第三道题过了40的解法

利用map计数,计算前后 m h y 的 净操作次数,比对三者净操作次数是否相同。

经大家提醒,这种解法缺少了对删除掉所有‘m' 'h' 'y'后的两字符串比较,所以没全过。

function mysol(n, arr) {
  let before = "",
    after = "";
  for (let i = 0; i < arr.length; i += 2) {
    before = arr[i];
    after = arr[i + 1];
    if (before.length == after.length && before != after) {
      console.log("No");
    } else if (before == after) {
      console.log("Yes");
    } else console.log(diff(before, after) ? "Yes" : "No");
  }
}
function diff(str1, str2) {
  let map = new Map();
  for (let c of str1) {
    map.set(c, (map.get(c) || 0) + 1);
  }
  for (let c of str2) {
    map.set(c, (map.get(c) || 0) - 1);
  }
  let [m, h, y] = [map.get("m") || 0, map.get("h") || 0, map.get("y") || 0];
  return m == h && h == y;
}
let n = 3,
  arr = ["mhbdy", "bd", "mhbdy", "mhmbhdyy", "mhy", "abc"];

mysol(n, arr);

#米哈游##米哈游2023春招求职进度交流#
全部评论
我做了好久,突然发现同时求出s和t中m,h,y的个数,减去最少的,比如s中m5个,h3个,y4ge,同时减3,就变成m2,h0,y1,再求t,如果这些数量不相等,就绝对不能成功,然后再把s和t中的m,h,y全删除,比较是否相等,这个两个条件加在一起就完成了。第一个条件和第二个条件都满足就可以转换,否则不行,做完后觉得很神奇
1 回复 分享
发布于 2023-03-19 22:39 湖南
同学你还记得第三道是要求有序还是无序吗?我按有序做的,死活只有20%,但我听说有同学按无序做的a了??是我看错题了吗
点赞 回复 分享
发布于 2023-03-19 22:21 浙江
第二题不是图的优先遍历嘛
点赞 回复 分享
发布于 2023-03-19 22:49 湖北
已经收到约面邮件了,还是比较快的
点赞 回复 分享
发布于 2023-03-20 16:29 河南

相关推荐

评论
4
11
分享
牛客网
牛客企业服务