今天我挑战新的算法,豆包MarsCode AI 刷题好刷到停不下来! 时尚圈的衣着稳定性问题 问题描述 小U在时尚圈组织了一场“校服日”活动,有 n 名学生围成一圈参加活动。每位学生都穿着白色或黑色的校服,白色用 0 表示,黑色用 1 表示。 每一天,如果某个学生发现自己和相邻的两位学生穿着相同颜色的校服,那么他会在第二天更换成另一种颜色的校服;否则,他会保持不变。 你的任务是帮助小U判断,在第几天学生们的穿着会达到稳定状态——即某一天后,所有学生的穿着不再发生任何变化。 同时,你还需要计算在稳定后,有多少学生的校服颜色与其相邻的同学不同,这些学生被称为“时尚达人”。 最终你需要返回一个包含两个元素的数组: 第一个数字表示稳定下来的天数。如果永远无法稳定,则输出 -1。 第二个数字表示稳定后成为“时尚达人”的学生人数。如果永远无法稳定,则输出 -1。
问题分析
- 输入:
n: 学生人数。data: 学生的初始穿着状态(白色用0,黑色用1)。
- 输出:
- 两个元素的数组:
- 稳定下来的天数(如果无法稳定则为
-1)。 - 稳定后成为“时尚达人”的学生人数(如果无法稳定则为
-1)。
- 稳定下来的天数(如果无法稳定则为
- 两个元素的数组:
解决思路
-
初始化:
- 将
data转换为列表current,以便后续修改。 - 初始化
days计数器为 0。
- 将
-
模拟过程:
- 使用一个循环进行每日状态更新,直到达到稳定状态或判断无法稳定。
- 在每一天中,创建一个
next_state列表来存储第二天的状态。 - 遍历每位学生:
- 判断当前学生与其相邻的两位学生的颜色:
- 如果相同,更新当前学生的颜色到
next_state。 - 标记状态有变化的标志
changed。
- 如果相同,更新当前学生的颜色到
- 判断当前学生与其相邻的两位学生的颜色:
-
稳定性判断:
- 每次循环结束后检查
changed标志:- 如果没有变化,表示状态已经稳定,退出循环。
- 检查所有学生的颜色是否相同(例如,都是
0或都是1):- 如果是,则返回
[-1, -1],表示无法稳定。
- 如果是,则返回
- 每次循环结束后检查
-
统计“时尚达人”:
- 遍历最终的
current状态,计算与邻居颜色不同的学生数量。
- 遍历最终的
-
返回结果:
- 返回天数和“时尚达人”数量的数组。
复杂度分析
- 时间复杂度:在最坏情况下,可能需要对每个学生进行多次检查,导致时间复杂度为 (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])