米哈游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 湖南
已经收到约面邮件了,还是比较快的
点赞 回复 分享
发布于 2023-03-20 16:29 河南
第二题不是图的优先遍历嘛
点赞 回复 分享
发布于 2023-03-19 22:49 湖北
同学你还记得第三道是要求有序还是无序吗?我按有序做的,死活只有20%,但我听说有同学按无序做的a了??是我看错题了吗
点赞 回复 分享
发布于 2023-03-19 22:21 浙江

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
Rena1ssanc...:对的,要是面评没太烂,勤更新简历等捞就行了,腾讯可以无限复活
点赞 评论 收藏
分享
半解316:内容充实,细节需要修改一下。 1,整体压缩为一页。所有内容顶格。 2,项目描述删除,直接写个人工作量 修改完之后还需要建议,可以私聊
点赞 评论 收藏
分享
评论
4
11
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务