多米诺骨牌|豆包MarsCode AI 刷题

59 阅读2分钟

这个问题要求模拟一个多米诺骨牌的倒下过程,并找出最后依然保持竖立的骨牌的位置。

思路分析:

  • 每个骨牌可能受到来自左侧或右侧的影响。
  • "L" 表示该骨牌会向左倒;"R" 表示该骨牌会向右倒;"." 表示该位置的骨牌保持竖立。
  • 我们需要模拟骨牌倒下的过程,并找到最终竖立的骨牌。

解决方案:

  1. 左向和右向推倒模拟

    • 从左到右扫描字符串,如果一个骨牌受到"R"的影响,它会开始倒向右边。
    • 从右到左扫描字符串,如果一个骨牌受到"L"的影响,它会开始倒向左边。
  2. 最终竖立的骨牌

    • 如果一个骨牌在左到右推倒过程中受力平衡,最终状态应该为竖立,反之亦然。
    • 需要根据相邻的"R"和"L"来判断哪些骨牌会竖立。

具体步骤:

  1. 初始化:为每个位置记录推倒的方向。
  2. 模拟过程:从左到右和从右到左分别模拟骨牌的推倒。
  3. 判断竖立:根据推倒的影响判断哪些骨牌保持竖立。

代码实现:

python
复制代码
def domino(num, data):
    n = len(data)
    
    # 模拟左右影响的时间轴
    left = [-1] * n  # 每个位置最终被左向影响的时间
    right = [-1] * n  # 每个位置最终被右向影响的时间
    
    # 从左到右,模拟右推的影响
    time = -1  # 时间计数器
    for i in range(n):
        if data[i] == 'R':
            time = 0
        elif data[i] == 'L':
            time = -1
        if time >= 0:
            right[i] = time
            time += 1
    
    # 从右到左,模拟左推的影响
    time = -1
    for i in range(n - 1, -1, -1):
        if data[i] == 'L':
            time = 0
        elif data[i] == 'R':
            time = -1
        if time >= 0:
            left[i] = time
            time += 1
    
    # 判断竖立骨牌
    result = []
    for i in range(n):
        if left[i] == right[i]:
            if data[i] == '.':
                result.append(i + 1)  # 保持竖立的骨牌位置
            elif data[i] == 'L' and left[i] == -1:
                result.append(i + 1)
            elif data[i] == 'R' and right[i] == -1:
                result.append(i + 1)
    
    if result:
        return f'{len(result)}:' + ','.join(map(str, result))
    else:
        return '0'

# 测试
print(domino(14, ".L.R...LR..L.."))  # '4:3,6,13,14'
print(domino(5, "R...."))  # '0'
print(domino(1, "."))  # '1:1'

解释:

  1. 初始化

    • left 数组和 right 数组分别记录每个位置上被左推或右推的时间。
  2. 模拟推倒

    • 从左到右处理"R",更新 right 数组。
    • 从右到左处理"L",更新 left 数组。
  3. 最终判断

    • 如果 left[i] == right[i],说明该骨牌受到左右两边的影响平衡,或者根本没有受到影响,保持竖立。

测试结果:

  • 对于输入 "R....",没有骨牌保持竖立,所以输出 '0'
  • 对于输入 ".L.R...LR..L..",骨牌 3, 6, 13, 14 保持竖立,所以输出 '4:3,6,13,14'
  • 对于输入 ".",只有一个骨牌保持竖立,所以输出 '1:1'

这个实现通过模拟左右推倒的过程,并根据影响时间来判断骨牌是否保持竖立。