开启我的LeetCode刷题日记:838. 推多米诺

178 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:838. 推多米诺

n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。

每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。

如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。

就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。

给你一个字符串 dominoes 表示这一行多米诺骨牌的初始状态,其中:

dominoes[i] = 'L',表示第 i 张多米诺骨牌被推向左侧, dominoes[i] = 'R',表示第 i 张多米诺骨牌被推向右侧, dominoes[i] = '.',表示没有推动第 i 张多米诺骨牌。 返回表示最终状态的字符串。

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/pu… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

  • 字符串替换,每进行一次while,相当于向左倒+向右倒一次
  • while之前,先将已平衡的牌R.L锁定
  • while中,若出现平衡状态的,也将其锁定
  • 最后解锁

代码实现

const pushDominoes = dominoes => {
  // 先将已平衡的牌锁定,状态肯定不会变
  dominoes = dominoes.replace(/R\.L/g, 'X');
  // 牌中只要有可以倒的牌,就循环
  while (dominoes.indexOf('R.') >= 0 || dominoes.indexOf('.L') >= 0) {
    // 向左倒
    dominoes = dominoes.replace(/\.L/g, 'LL');
    // 向右倒
    dominoes = dominoes.replace(/R\./g, 'RR');
    // 若出现平衡状态的,将其锁定
    dominoes = dominoes.replace(/R\.L/g, 'X');
  }
  // 最后没有可以倒的牌,将平衡状态的解锁
  dominoes = dominoes.replace(/X/g, 'R.L');
  return dominoes;
};



总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹