问题回顾
在骨牌的模拟倒下过程中:
L表示骨牌向左倒。R表示骨牌向右倒。.表示骨牌目前竖立,需要判断是否会因左侧或右侧的推力倒下。
目标是:经过所有力的作用后,统计最终仍然竖立的骨牌数量和位置。
解题思路
为了解决这个问题,我们需要明确骨牌如何受力并确定是否倒下。为此,我们使用以下步骤:
1. 初始化受力数组
我们创建一个与骨牌状态相同长度的数组 forces,用来存储每个骨牌受的“力”:
- 正数 表示右推的力(
R的影响)。 - 负数 表示左推的力(
L的影响)。 - 0 表示骨牌既没有受到左推也没有受到右推的影响。
2. 从左向右遍历,计算右推力
我们模拟右推力的传播过程:
- 遇到
R:设置当前的力值为一个较大的数(我们取num,即骨牌总数量,表示强推力)。 - 遇到
L:右推力无法继续传播,将力值重置为 0。 - 遇到
.:右推力逐渐衰减,每往右传播一格,力值减 1,直到减为 0。
通过这个过程,我们可以记录右推力的影响范围和强度。
3. 从右向左遍历,计算左推力
同理,我们模拟左推力的传播过程:
- 遇到
L:设置当前的力值为一个较大的数(同样取num,表示强推力)。 - 遇到
R:左推力无法继续传播,将力值重置为 0。 - 遇到
.:左推力逐渐衰减,每往左传播一格,力值减 1,直到减为 0。
遍历结束后,右推力和左推力的影响会分别记录在 forces 数组中,但注意:
- 右推力的值是正数。
- 左推力的值是负数。
4. 合并结果,判断骨牌是否竖立
对每个骨牌位置,我们根据 forces 数组的值:
- 如果力值为 0 且骨牌为
.,说明它既没有受到左推也没有受到右推,可以保持竖立。 - 其他情况(力值不为 0),骨牌会倒下。
示例详解
以测试样例 num = 14, data = ".L.R...LR..L.." 为例:
第一步:从左向右计算右推力
遍历骨牌字符串:
-
初始
forces = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]。 -
遇到第 4 个骨牌
R,设置右推力为 14。 -
接下来右推力逐渐衰减,每向右一格减 1,直到遇到第 8 个骨牌
L,右推力被重置为 0。 -
最终右推力对
forces的影响为:css 复制代码 forces = [0, 0, 0, 14, 13, 12, 11, 0, 0, 0, 0, 0, 0, 0]
第二步:从右向左计算左推力
再次遍历骨牌字符串:
-
初始
forces保持不变。 -
遇到第 8 个骨牌
L,设置左推力为 -14。 -
接下来左推力逐渐衰减,每向左一格加 1(注意:是负值逐渐变小),直到遇到第 4 个骨牌
R,左推力被重置为 0。 -
最终左推力对
forces的影响为:css 复制代码 forces = [0, -12, -13, 14, 13, 12, 11, -14, -13, -12, -11, -10, -9, -8]
第三步:计算最终稳定的骨牌
根据合并后的 forces:
- 第 3、6、13、14 位置的
forces值为 0,且对应的骨牌为.,这些骨牌保持竖立。 - 稳定骨牌的位置为
[3, 6, 13, 14]。
输出结果
根据竖立骨牌数量和位置,格式化输出结果为:
arduino
复制代码
"4:3,6,13,14"
复杂度分析
- 时间复杂度:O(n),其中
n为骨牌的数量。遍历字符串两次(从左向右和从右向左),每次都是 O(n)。 - 空间复杂度:O(n),使用了一个长度为
n的数组forces来存储力的计算结果。