多米诺骨牌均衡状态 问题描述 小S玩起了多米诺骨牌,他排列了一行骨牌,并可能将某些骨牌向左或向右推倒。随着骨牌连锁反应的进行,一些骨牌可能因为左右两侧受力平衡而保持竖立。现在小S想要知道在所有动作完成后,哪些骨牌保持竖立。
给定一个表示骨牌初始状态的字符串,其中:
"L" 表示该位置的骨牌将向左倒。 "R" 表示该位置的骨牌将向右倒。 "." 表示该位置的骨牌初始时保持竖立。 模拟整个骨牌倒下的过程,求出最终仍然保持竖立的骨牌的数目和位置。
测试样例 样例1:
输入:num = 14,data = ".L.R...LR..L.." 输出:'4:3,6,13,14'
样例2:
输入:num = 5,data = "R...." 输出:'0'
样例3:
输入:num = 1,data = "." 输出:'1:1'
代码:
主要逻辑: 初始化变量:
dominoes:存储骨牌的状态('R'、'L' 或 '.')转换为字符数组。 temp:存储初始的骨牌状态,做备份用。 changed:标记是否发生变化,用于控制循环。 next:用于存储每一轮变化后的骨牌状态。 骨牌倒下模拟:
使用一个 while 循环,不断更新骨牌的状态,直到没有变化为止。
每次循环中,从左到右遍历骨牌数组:
如果当前骨牌是 .(竖立),检查其两侧的骨牌:
如果左边有 R,则受到了右力。 如果右边有 L,则受到了左力。 根据左右力的比较,决定骨牌是倒向左还是倒向右:
如果左力更强,则将当前骨牌标记为 R。 如果右力更强,则将当前骨牌标记为 L。 如果有任何骨牌状态发生变化,changed 设为 true,并继续循环。
最终结果:
一旦骨牌的状态不再变化,遍历最终的 dominoes 数组,找到所有竖立的骨牌(即 .)。 将竖立骨牌的索引(从 1 开始)存储到 standing 列表中。 如果没有竖立的骨牌,返回 "0";否则返回竖立骨牌的数量和编号。 输出格式:
如果有竖立的骨牌,按指定格式输出(格式如:4:3,6,13,14)。 代码解析: 将输入的字符串 data 转换为字符数组 domnoes,并使用 System.arraycopy 备份初始状态。
设置一个 while 循环,直到没有变化为止。每次循环内,changed 初始为 false,表示假设本轮没有变化。
遍历每个骨牌,如果是竖立的('.'),检查其左右两侧的骨牌:
如果左侧是 R,表示向右推力。 如果右侧是 L,表示向左推力。 根据力的大小,决定当前骨牌是倒向左 ('L') 还是倒向右 ('R')。 更新当前的骨牌状态为下一轮的状态。
循环结束后,遍历最终的骨牌状态,找出所有竖立的骨牌,记录它们的编号。
最后,返回竖立骨牌的数量及其编号。如果没有竖立的骨牌,返回 "0"。
测试用例分析:
solution(14, ".L.R...LR..L..") 输出 "4:3,6,13,14",因为只有这些骨牌最终保持竖立。 solution(5, "R....") 输出 "0",所有骨牌都倒下了。 solution(1, ".") 输出 "1:1",唯一的骨牌保持竖立。 solution(3, "R.L") 输出 "1:2",仅第二个骨牌保持竖立。 solution(7, "..R...L") 输出 "2:1,2",前两个骨牌保持竖立。 笔记java开发语言