米哈游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 浙江

相关推荐

03-15 14:55
已编辑
门头沟学院 golang
bg:双非学院本&nbsp;ACM银&nbsp;go选手timeline:3.1号开始暑期投递3.7号第二家公司离职顽岩科技&nbsp;ai服务中台方向&nbsp;笔试➕两轮面试,二面挂(钱真的好多😭)厦门纳克希科技&nbsp;搞AI的,一面OC猎豹移动&nbsp;搞AIGC方向&nbsp;一面OC北京七牛云&nbsp;搞AI接口方向&nbsp;一面OC上海古德猫宁&nbsp;搞AIGC方向&nbsp;二面OC上海简文&nbsp;面试撞了直接拒深圳图灵&nbsp;搞AIGC方向一面后无消息懒得问了,面试官当场反馈不错其他小厂没记,通过率80%,小厂杀手😂北京字节&nbsp;具体业务不方便透露也是AIGC后端方向2.28约面&nbsp;(不知道怎么捞的我,我也没在别的地方投过字节简历哇)3.6一面&nbsp;一小时&nbsp;半小时拷打简历(主要是AIGC部分)剩余半小时两个看代码猜结果(经典go问题)➕合并二叉树(秒a,但是造case造了10分钟哈哈)一天后约二面3.12&nbsp;二面,让我挑简历上两个亮点说,主要说的docker容器生命周期管理和raft协议使用二分法优化新任leader上任后与follower同步时间。跟面试官有共鸣,面试官还问我docker底层cpu隔离原理和是否知道虚拟显存。之后一道easy算法,(o1空间解决&nbsp;给定字符串含有{和}是否合法)秒a,之后进阶版如何用10台机加快构建,想五分钟后a出来。面试官以为45分钟面试时间,留了18分钟让我跟他随便聊,后面考了linux&nbsp;top和free的部分数据说什么意思(专业对口了只能说,但是当时没答很好)。因为当时手里有7牛云offer,跟面试官说能否快点面试,马上另外一家时间到了。10分钟后约hr面3.13,上午hr面,下午走完流程offer到手3.14腾讯技术运营约面,想直接拒😂感受:&nbsp;因为有AIGC经验所以特别受AI初创公司青睐,AIGC后端感觉竞争很小(指今年),全是简历拷打,基本没有人问我八股(八股吟唱被打断.jpeg),学的东西比较广的同时也能纵向深挖学习,也运气比较好了哈哈可能出于性格原因,没有走主流Java路线,也没有去主动跟着课写项目,项目都是自己研究和写的哈哈
烤点老白薯:你根本不是典型学院本的那种人,贵了你这能力
查看7道真题和解析
点赞 评论 收藏
分享
评论
4
11
分享

创作者周榜

更多
牛客网
牛客企业服务