LEETCODE838java

Leetcode838推多米诺Java实现
哈哈哈~,第一次写博客。本人还是小菜鸡,有不足之处还请指出。谢谢啦。

Leetcode

LEETCODE838java

推多米诺题目

LEETCODE838javaLEETCODE838java

解题思路

本题刚开始看的时候,直觉反应就是用两个变量来记录L R的下标。首先把字符串以数组的形式存储,然后使用left指引左边的L/R,right指引右边的L/R。然后再对left --right之间的数组元素进行修改。对数组进行一次遍历就可以了。
首先是设置left,right均为0;如图所示可以看到。我们的left和right的指向。
LEETCODE838java
LEETCODE838java
LEETCODE838java
LEETCODE838java
LEETCODE838java
LEETCODE838java
LEETCODE838java

具体分析

因为每一个多米诺都和自己左右的多米诺有关系。首先我们先找到其右边的多米诺不为’.'的情况,即dom[right]==‘L/R’。分情况讨论:

**如果dom[right]=‘L’ **可知dom[left]=’./L/R’。

  1. 当dom[left]=’./L’时(dom[left]=’.'是的情况是left第一次还未移动),left–right之间的所有数组元素均为L。
  2. 当dom[left]='R’时 即为情况 R。。。。L此时,我们要判断它们之间的数组元素是奇或偶,以此来修改数组元素。

如果dom[right]='R’
3. dom[left]=’./L’,不需执行任何操作,只需将left后移到right的位置。
4. dom[left]=‘R’,将left–right之间的数组元素全都变为’R’.

**如果dom[right]=’.’**说明数组的最后一个位置为’.‘且right==dom.length-1这种情况下。我们只需要判断如果dom[left]是否为’R’,若是则left–right均为’R’
否则不变。

源码

class Solution {
public String pushDominoes(String dominoes) {
char [] dom = dominoes.toCharArray();
int leftpush=0;
int rightpush=0;
for(int i=0;i<dom.length;i++){
rightpush=i;
if(dom[rightpush]‘L’){
if(dom[leftpush]
’.’||dom[leftpush]‘L’)
{
for(int j=leftpush;j<rightpush;j++){
dom[j]=‘L’;
}}
else if(dom[leftpush]
‘R’){
int count =(rightpush-leftpush-1)/2;
for(int m=leftpush+1;m<=leftpush+count;m++){
dom[m]=‘R’;
}
for(int m=rightpush-1;m>=rightpush-count;m–){
dom[m]=‘L’;
}
}
leftpush=rightpush;
}
else if(dom[rightpush]‘R’&&rightpush!=dom.length-1){
if(dom[leftpush]
‘R’){
for(int m=leftpush+1;m<rightpush;m++)
dom[m]=‘R’;
}
leftpush =rightpush;
}
else if(rightpushdom.length-1 &&dom[leftpush]‘R’){
for(int m=leftpush+1;m<=rightpush;m++)
dom[m] = ‘R’;
}
}
String sb =new String(dom);
return sb;
}
}