青训营刷题日记02 | 豆包MarsCode AI 刷题

142 阅读3分钟

今天我挑战新的算法,豆包MarsCode AI 刷题好刷到停不下来! 时尚圈的衣着稳定性问题 问题描述 小U在时尚圈组织了一场“校服日”活动,有 n 名学生围成一圈参加活动。每位学生都穿着白色或黑色的校服,白色用 0 表示,黑色用 1 表示。 每一天,如果某个学生发现自己和相邻的两位学生穿着相同颜色的校服,那么他会在第二天更换成另一种颜色的校服;否则,他会保持不变。 你的任务是帮助小U判断,在第几天学生们的穿着会达到稳定状态——即某一天后,所有学生的穿着不再发生任何变化。 同时,你还需要计算在稳定后,有多少学生的校服颜色与其相邻的同学不同,这些学生被称为“时尚达人”。 最终你需要返回一个包含两个元素的数组: 第一个数字表示稳定下来的天数。如果永远无法稳定,则输出 -1。 第二个数字表示稳定后成为“时尚达人”的学生人数。如果永远无法稳定,则输出 -1。

问题分析

  • 输入
    • n: 学生人数。
    • data: 学生的初始穿着状态(白色用 0,黑色用 1)。
  • 输出
    • 两个元素的数组:
      1. 稳定下来的天数(如果无法稳定则为 -1)。
      2. 稳定后成为“时尚达人”的学生人数(如果无法稳定则为 -1)。

解决思路

  1. 初始化

    • data 转换为列表 current,以便后续修改。
    • 初始化 days 计数器为 0。
  2. 模拟过程

    • 使用一个循环进行每日状态更新,直到达到稳定状态或判断无法稳定。
    • 在每一天中,创建一个 next_state 列表来存储第二天的状态。
    • 遍历每位学生:
      • 判断当前学生与其相邻的两位学生的颜色:
        • 如果相同,更新当前学生的颜色到 next_state
        • 标记状态有变化的标志 changed
  3. 稳定性判断

    • 每次循环结束后检查 changed 标志:
      • 如果没有变化,表示状态已经稳定,退出循环。
    • 检查所有学生的颜色是否相同(例如,都是 0 或都是 1):
      • 如果是,则返回 [-1, -1],表示无法稳定。
  4. 统计“时尚达人”

    • 遍历最终的 current 状态,计算与邻居颜色不同的学生数量。
  5. 返回结果

    • 返回天数和“时尚达人”数量的数组。

复杂度分析

  • 时间复杂度:在最坏情况下,可能需要对每个学生进行多次检查,导致时间复杂度为 (O(n^2))。
  • 空间复杂度:使用了一个额外的列表来存储状态,空间复杂度为 (O(n))。
    current = list(data)
    days = 0

    while True:
        next_state = current[:]
        changed = False

        for i in range(n):
            # Check the colors of the adjacent students
            if current[i] == current[(i - 1) % n] == current[(i + 1) % n]:
                next_state[i] = '1' if current[i] == '0' else '0'
                changed = True

        days += 1
        
        # Check for stabilization
        if not changed:
            break
        
        current = next_state
        
        # To prevent infinite loops, check if all students are in the same state
        if all(color == current[0] for color in current):
            return [-1, -1]

    # Count "fashionistas"
    fashionistas = sum(1 for i in range(n) if current[i] != current[(i - 1) % n] and current[i] != current[(i + 1) % n])

    return [days, fashionistas]

if __name__ == "__main__":
    # Add your test cases here
    print(solution(4, "0000") == [-1, -1])
    print(solution(4, "1110") == [2, 4])
    print(solution(6, "010101") == [1, 6])