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

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

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

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

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

  • dominoes[i] = 'L',表示第 i 张多米诺骨牌被推向左侧,
  • dominoes[i] = 'R',表示第 i 张多米诺骨牌被推向右侧,
  • dominoes[i] = '.',表示没有推动第 i 张多米诺骨牌。

返回表示最终状态的字符串。

示例 1:
输入:dominoes = "RR.L"
输出:"RR.L"
解释:第一张多米诺骨牌没有给第二张施加额外的力。

示例 2:
输入:dominoes = ".L.R...LR..L.."
输出:"LL.RR.LLRRLL.."

提示:

  • n == dominoes.length
  • 1 <= n <= 105
  • dominoes[i] 为 'L'、'R' 或 '.'

分析:

方法:双指针

本题讨论的是推倒多米诺骨牌后直立的骨牌的状态,即 '.' 的状态,而 '.' 的状态无非就四种,左左、左右、右左、右右之间,分析这四种情况可以得出推倒后的情况:

  • L...L → LLLLL
  • L...R → L...R
  • R...L → RR.LL
  • R...R → RRRRR

那么我们可以定义指针指向前一个力,当遍历到新的力时,根据以上情况对中间字符进行修改,然后新力变上一个力,继续遍历。值得注意的是,遍历完后可能最后是 "..." 的情况,可以把最后一个力当做 R,在修改一次。

时间复杂度:O(n) 
空间复杂度:O(1)

class Solution {public String pushDominoes(String dominoes) {//定义长度int len = dominoes.length();//变为字符数组char[] cs = dominoes.toCharArray();//标识上一个力char left = 'L';//记录上一个有力的索引int pre = 0;//遍历字符串for(int i = 0; i < len; ++i){//遇到力if(cs[i] != '.'){//改变两力之间的多米诺change(left, cs[i], pre, i, cs);//当前索引变为上一索引pre = i+1;//上个力变为当前力left = cs[i];}}//修改最后的多米诺change(left, 'R', pre, len, cs);//返回结果return String.valueOf(cs);}//改变两个用力中间的多米诺public void change(char left, char right, int i, int j, char[] cs){//L...R类型if(left == 'L' && right == 'R'){return;}//L...L类型或R...R类型if(left == right){//将所有字符赋为L或Rwhile(i < j){cs[i] = left;i++;}return;}//R...L类型//双向赋值while(i < --j){cs[i] = 'R';cs[j] = 'L';i++;}}
}

题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/push-dominoes

JAVA练习150-推多米诺相关推荐

  1. Java实现 LeetCode 838 推多米诺(暴力模拟)

    838. 推多米诺 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌. 同样地, ...

  2. leetcode 838.推多米诺

    题目地址(838. 推多米诺) https://leetcode-cn.com/problems/push-dominoes/ 题目描述 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时, ...

  3. LeetCode:838. 推多米诺————中等

    题目 838. 推多米诺 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右边 ...

  4. 【leetcode】838. 推多米诺(模拟)

    题目: 838. 推多米诺 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右 ...

  5. Leetcode 838. 推多米诺 C++

    Leetcode 838. 推多米诺 题目 一行中有 N 张多米诺骨牌,我们将每张多米诺骨牌垂直竖立. 在开始时,我们同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻 ...

  6. LeetCode838. 推多米诺

    LeetCode838. 推多米诺 1. 问题描述 2. 思路 双指针 3. 代码 func pushDominoes(dominoes string) string {dominoes = &quo ...

  7. leetcode-838:推多米诺

    leetcode-838:推多米诺 题目 解题 方法一:BFS 方法二:双指针(模拟) 题目 题目链接 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. ...

  8. 算法题 推多米诺 模拟、队列与黑魔法

    推多米诺 模拟.队列与黑魔法 题目 n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地 ...

  9. Java实现 LeetCode 790 多米诺和托米诺平铺(递推)

    790. 多米诺和托米诺平铺 有两种形状的瓷砖:一种是 2x1 的多米诺形,另一种是形如 "L" 的托米诺形.两种形状都可以旋转. XX <- 多米诺 XX <- &q ...

  10. 【算法】leetcode-838 推多米诺

    n 张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立.在开始时,同时把一些多米诺骨牌向左或向右推. 每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌.同样地,倒向右边的多米诺骨牌也会推动竖立在 ...

最新文章

  1. Hinton一作新论文:如何在神经网络中表示“部分-整体层次结构”?
  2. Linux命令技巧之30个必会的命令技巧
  3. Chrome开发者工具详解(2)-Network面板
  4. 让服务器apache/iis/nginx支持.apk/ipa文件下载
  5. SAP 外向交货的包装功能实现
  6. 《程序员面试金典》最大连续数列和
  7. inner join 重复数据_Ramp;Python Data Science 系列:数据处理(2)
  8. C# 使用List泛型读取和保存文本文件(转载)
  9. ETH基金会社区经理:以太坊改进流程EIP-1正在更新
  10. /common/nlp/data/dictionary/CoreNatureDictionary.mini.txt加载失败
  11. 网络七层,五层,四层模型,数据封装、解封装,进制转换。
  12. 如何在一个项目中兼容Wepy和Taro?
  13. 2012年波兰乌克兰欧洲杯完全赛程(06.09-07.02)
  14. 网络营销数据解读(九)——客户族群细分(Segmentation)2-2
  15. MIT操作系统实验-XV6项目环境搭建
  16. 精品软件 推荐 淘宝 天猫 秒杀助手
  17. Java Web学习(1):Web应用程序与Web服务器
  18. 前端H5企业微信第三方应用开发浅谈(一)
  19. Json转XML后将首字母大写(或者其他自己的需求格式)对象中包含list集合以及日期字段的处理(注解形式)
  20. c++ Win x64 注册表操作

热门文章

  1. if 0 endif的使用
  2. 计算机组装上课心得1000字,关于计算机组装也优秀实训心得精选
  3. css实现table中的文字垂直水平居中
  4. System is currently unhealthy because Docker is configured incorrectly. Use the link to learn more a
  5. CIFS与SMB与samba
  6. 2015年考研英语二真题
  7. iCalendar格式中关于RRule的解析和生成 DDay.iCal
  8. [总结]迟到的期中考总结
  9. 程序员的浪漫表白代码(JS+CSS+HTML)附带源码
  10. B - Minimize Ordering