力扣838.推多米诺随笔
“生活就像海洋,只有意志坚强的人,才能到达彼岸。”—— 马克思
题目
n
张多米诺骨牌排成一行,将每张多米诺骨牌垂直竖立。在开始时,同时把一些多米诺骨牌向左或向右推。
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
如果一张垂直竖立的多米诺骨牌的两侧同时有多米诺骨牌倒下时,由于受力平衡, 该骨牌仍然保持不变。
就这个问题而言,我们会认为一张正在倒下的多米诺骨牌不会对其它正在倒下或已经倒下的多米诺骨牌施加额外的力。
给你一个字符串 dominoes
表示这一行多米诺骨牌的初始状态,其中:
dominoes[i] = 'L'
,表示第i
张多米诺骨牌被推向左侧,dominoes[i] = 'R'
,表示第i
张多米诺骨牌被推向右侧,dominoes[i] = '.'
,表示没有推动第i
张多米诺骨牌。
返回表示最终状态的字符串。
难度:中等
分析
我们遍历字符串,根据当前位置上的值进行分类讨论:
当前值为'.':跳过;
当前值为'L':把之前的'.'置为'L'直到遇到非'.'的位置;
当前值为'R':寻找下一个非'.'的位置,如果没有或者下一个位置为'R',将之间的'.'置为'R',跳到下一个非'.'的位置;如果下一个位置为'L',则将之间的'.'左边的置为'R',右边的置为'L',中间的不变,跳到'L'的下一位。
注意到我们没有判断当前值为'L'并且上一个非'.'位置为'R'的情况是因为该情况已被跳过(在当前值为'R'并且下一个非'.'值为'L'的情况中处理)以避免重复操作。
解答
class Solution {public String pushDominoes(String dominoes) {char[] arr=dominoes.toCharArray();int n=arr.length;int index=0;while (index<n){if (arr[index]=='.'){index++;}else if (arr[index]=='L'){for (int i=index-1;i>=0;i--){if (arr[i]!='.'){break;}arr[i]='L';}index++;}else{int nextIndex;for (nextIndex=index+1;nextIndex<n;nextIndex++){if (arr[nextIndex]!='.'){break;}}if (nextIndex==n||arr[nextIndex]=='R'){for (int i=index+1;i<nextIndex;i++){arr[i]='R';}index=nextIndex;}else{ //index R nextIndex Lfor (int i=1;index+i<nextIndex-i;i++){arr[index+i]='R';arr[nextIndex-i]='L';}index=nextIndex+1;}}}return new String(arr);}
}
“治于神者,众人不知其功;争于明者,众人知之。”——《墨子》