[Leetcode学习-java&c++]Push Dominoes

46 篇文章 0 订阅

问题:

难度:medium

说明:

给出一个字符,字符只包含 'L' 'R' '.' 三种字符,其实整个数组是表示一个多米诺骨牌状态, L 表示当前的骨牌处于 左倒 状态, R 表示骨牌 右倒 状态,. 表示树立,没有倒下的状态。

要求当前给出的数组状态,求出最终的多米诺骨牌状态,设定所有骨牌倒下运动速度一样。

题目连接:https://leetcode.com/problems/push-dominoes/

输入范围:

  • n == dominoes.length
  • 1 <= n <= 105
  • dominoes[i] is either 'L''R', or '.'.

输入案例:

Example 1:
Input: dominoes = "RR.L"
Output: "RR.L"
Explanation: The first domino expends no additional force on the second domino.

Example 2:

Input: dominoes = ".L.R...LR..L.."
Output: "LL.RR.LLRRLL.."

我的代码:

其实可以当做滑动窗口处理,不过主要是很多细节地方要注意,比如要保留往右倒下的起始点,又要判断右倒下起始点是否不存在,等等,这块考的还是细节的逻辑。

Java:

class Solution {
    public String pushDominoes(String dominoes) {
        int Ridx = -1;
        char[] chs = dominoes.toCharArray();
        for(int i = 0, len = dominoes.length(); i < len; ) {
            if(chs[i] == 'L') {
                int j = i, begin = Ridx == -1 ? -1 : (i + Ridx >> 1);
                while(-- j >= 0 && ((chs[j] != 'R' || j > begin) && chs[j] != 'L'))
                    chs[j] = 'L';
                if(begin != -1 && j >= begin && ((i + Ridx) & 1) == 0)
                    chs[begin] = Ridx != -1 && begin != Ridx ? '.' : 'L';
                Ridx = i;
                i ++;
            } else if(chs[i] == 'R') {
                Ridx = i;
                while(++ i < len && chs[i] == '.') chs[i] = 'R';
            } else i ++;
        }
        return new String(chs);
    }
}

C++:

class Solution {
public:
    string pushDominoes(string dominoes) {
        int Ridx = -1, begin = -1, j = -1;
        for(int i = 0, len = dominoes.length(); i < len;) {
            if(dominoes[i] == 'L') {
                j = i, begin = Ridx == -1 ? -1 : ((Ridx + i) >> 1);
                while(-- j >= 0 && ((dominoes[j] != 'R' || j > begin) && dominoes[j] != 'L'))
                    dominoes[j] = 'L';
                if(begin != -1 && j >= begin && ((Ridx + i) & 1) == 0) 
                    dominoes[begin] = Ridx != -1 && begin != Ridx ? '.' : 'L';
                Ridx = i;
                i ++;
            } else if(dominoes[i] == 'R') {
                Ridx = i;
                while(++ i < len && dominoes[i] == '.') dominoes[i] = 'R';
            } else i ++;
        }
        return dominoes;
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值