本文主要是介绍838. 推多米诺,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一行中有 N
张多米诺骨牌,我们将每张多米诺骨牌垂直竖立。
在开始时,我们同时把一些多米诺骨牌向左或向右推。
每过一秒,倒向左边的多米诺骨牌会推动其左侧相邻的多米诺骨牌。
同样地,倒向右边的多米诺骨牌也会推动竖立在其右侧的相邻多米诺骨牌。
如果同时有多米诺骨牌落在一张垂直竖立的多米诺骨牌的两边,由于受力平衡, 该骨牌仍然保持不变。
就这个问题而言,我们会认为正在下降的多米诺骨牌不会对其它正在下降或已经下降的多米诺骨牌施加额外的力。
给定表示初始状态的字符串 "S" 。如果第 i 张多米诺骨牌被推向左边,则 S[i] = 'L'
;如果第 i 张多米诺骨牌被推向右边,则 S[i] = 'R'
;如果第 i 张多米诺骨牌没有被推动,则 S[i] = '.'
。
返回表示最终状态的字符串。
示例 1:
输入:".L.R...LR..L.." 输出:"LL.RR.LLRRLL.."
示例 2:
输入:"RR.L" 输出:"RR.L" 说明:第一张多米诺骨牌没有给第二张施加额外的力。
提示:
0 <= N <= 10^5
- 表示多米诺骨牌状态的字符串只含有
'L'
,'R'
; 以及'.'
;
========================================================================
解题思路:
1.第一个L,前面的 . 全变为L
2.第一个R,前面的 . 不变
3.遍历到R, 继续往前找,如果找到R, 就把两个R之间的变成R,如果找到L 一半R一半L中间那个是 .
4.如果最后一个元素是 . ,找前面的字母,如果为L,则不变 如果为R,后面的全变成R
这种题属于那种业务题,写一步看一步...
class Solution {public String pushDominoes(String dominoes) {StringBuilder result = new StringBuilder();char[] chars = dominoes.toCharArray();int preIndex = 0;char preStatus = '.';if (chars.length<2){return dominoes;}for (int i = 0; i < chars.length; i++) {if (chars[i]=='.'){if(i==chars.length-1){for(int j = chars.length-1; j > -1; j--){if(chars[j]=='.'&&preStatus!='R'){result.append('.');}else if(chars[j]=='.'){result.append('R');}else{break;}}}continue;}if (chars[i]=='L'){if (preStatus=='L'){appendResult(result,'L',i-preIndex-1);}else if(preStatus=='.'){appendResult(result,'L',i-preIndex);}else{appendResult(result,'R',(i-preIndex-1)/2);if ((i-preIndex-1)%2==1){appendResult(result,'.',1);}appendResult(result,'L',(i-preIndex-1)/2);}}else{if(preStatus=='R'){appendResult(result,'R',i-preIndex-1);}if(preStatus=='.'){appendResult(result,'.',i-preIndex);}if(preStatus=='L'){appendResult(result,'.',i-preIndex-1);}}result.append(chars[i]);preStatus=chars[i];preIndex=i;}return result.toString();}private void appendResult(StringBuilder result,char it,int amount){for (int i = 0; i < amount; i++) {result.append(it);}}
}
这篇关于838. 推多米诺的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!