多米诺骨牌均衡状态|豆包MarsCode AI刷题

124 阅读4分钟

问题描述 小S玩起了多米诺骨牌,他排列了一行骨牌,并可能将某些骨牌向左或向右推倒。随着骨牌连锁反应的进行,一些骨牌可能因为左右两侧受力平衡而保持竖立。现在小S想要知道在所有动作完成后,哪些骨牌保持竖立。

给定一个表示骨牌初始状态的字符串,其中:

"L" 表示该位置的骨牌将向左倒。 "R" 表示该位置的骨牌将向右倒。 "." 表示该位置的骨牌初始时保持竖立。 模拟整个骨牌倒下的过程,求出最终仍然保持竖立的骨牌的数目和位置。

利用豆包MarsCode AI为我提供了编码思路: 问题理解 我们需要模拟多米诺骨牌倒下的过程,并找出最终保持竖立的骨牌的位置。骨牌的状态由字符串 data 表示,其中: 'L' 表示该位置的骨牌将向左倒。 'R' 表示该位置的骨牌将向右倒。 '.' 表示该位置的骨牌初始时保持竖立。 数据结构选择 我们可以使用两个数组来记录每个骨牌受到的左力和右力: left_forces:记录每个骨牌受到的左力。 right_forces:记录每个骨牌受到的右力。 算法步骤 初始化: 初始化 left_forces 和 right_forces 数组,初始值设为无穷大(表示没有受到力)。 处理右倒的骨牌: 遍历字符串 data,记录最近一次遇到的 'R' 的位置。 对于每个位置,如果当前位置是 'R',则更新 right_time 为当前位置。 如果当前位置是 'L',则重置 right_time 为 -1。 如果 right_time 不为 -1,则计算当前位置受到的右力(即当前位置与 right_time 的距离),并更新 right_forces。 处理左倒的骨牌: 从右向左遍历字符串 data,记录最近一次遇到的 'L' 的位置。 对于每个位置,如果当前位置是 'L',则更新 left_time 为当前位置。 如果当前位置是 'R',则重置 left_time 为 -1。 如果 left_time 不为 -1,则计算当前位置受到的左力(即 left_time 与当前位置的距离),并更新 left_forces。 确定保持竖立的骨牌: 遍历所有骨牌,如果某个骨牌受到的左力和右力相等,则该骨牌保持竖立。 记录这些骨牌的位置,并返回结果。

编写了如下代码:

def solution(num, data):
    # 初始化两个列表,分别记录每个骨牌受到的左力和右力
    left_forces = [float('inf')] * num  # 左力
    right_forces = [float('inf')] * num  # 右力

    # 处理右倒的骨牌
    right_time = -1
    for i in range(num):
        if data[i] == 'R':
            right_time = i
        elif data[i] == 'L':
            right_time = -1
        if right_time != -1:
            right_forces[i] = i - right_time

    # 处理左倒的骨牌
    left_time = -1
    for i in range(num - 1, -1, -1):
        if data[i] == 'L':
            left_time = i
        elif data[i] == 'R':
            left_time = -1
        if left_time != -1:
            left_forces[i] = left_time - i

    # 确定保持竖立的骨牌
    result = []
    for i in range(num):
        if left_forces[i] == right_forces[i]:
            result.append(i + 1)

    if result:
        return f"{len(result)}:{','.join(map(str, result))}"
    else:
        return "0"


# 测试用例
print(solution(14, ".L.R...LR..L..") == "4:3,6,13,14")
print(solution(5, "R....") == "0")
print(solution(1, ".") == "1:1")

编写完成后,利用豆包MarsCode AI帮我检查了代码: 问题分析 初始化: left_forces 和 right_forces 初始化为 float('inf'),表示没有受到力,这是合理的。 处理右倒的骨牌: 遍历字符串 data,记录最近一次遇到的 'R' 的位置。 如果遇到 'L',重置 right_time 为 -1,这是合理的。 计算右力时,right_forces[i] = i - right_time,这是合理的。 处理左倒的骨牌: 从右向左遍历字符串 data,记录最近一次遇到的 'L' 的位置。 如果遇到 'R',重置 left_time 为 -1,这是合理的。 计算左力时,left_forces[i] = left_time - i,这是合理的。 确定保持竖立的骨牌: 遍历所有骨牌,如果某个骨牌受到的左力和右力相等,则该骨牌保持竖立。 记录这些骨牌的位置,并返回结果。 可能的问题 边界条件: 如果 data 中没有 'R' 或 'L',代码是否能正确处理? 如果 data 中只有一个骨牌,代码是否能正确处理? 力的大小比较: 当前代码假设 left_forces[i] == right_forces[i] 时骨牌保持竖立,但实际情况可能更复杂,需要考虑力的大小和方向。 改进建议 力的大小比较: 可以考虑使用绝对值来比较力的大小,而不是直接比较 left_forces[i] 和 right_forces[i]。 边界条件处理: 可以添加一些边界条件测试,确保代码在各种情况下都能正确运行。