刷题分享|豆包MarsCode AI刷题

21 阅读6分钟

第96题:时尚圈衣着问题

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

测试样例

样例1:

输入:n = 4 ,data = "0000" 输出:[-1, -1]

样例2:

输入:n = 4 ,data = "1110" 输出:[2, 4]

样例3:

输入:n = 6 ,data = "010101" 输出:[1, 6] ———————————————————— (一)问题分析:

稳定状态的定义:

稳定状态是指在某一天后,所有学生的校服颜色不再发生变化。换句话说,经过若干天的变化后,学生们的校服颜色将不再改变。我们需要考虑以下几个方面:

  1. 变化规则:每位学生的校服颜色变化依赖于他与相邻两位学生的颜色。如果三者相同,学生会改变颜色;如果不同,则保持不变。

  2. 循环结构:由于学生是围成一圈的,因此在判断相邻学生时需要考虑循环的特性,即第一个学生的左边是最后一个学生,最后一个学生的右边是第一个学生。

  3. 稳定性判断:如果经过 n 天仍未达到稳定状态,则可以推断出该状态将永远无法稳定。

(二)解决方案的思路

  1. 状态表示:使用一个列表来表示当前每位学生的校服颜色,初始状态由输入数据提供。

  2. 模拟过程:通过一个循环来模拟每一天的变化。在每一天中,检查每位学生的相邻学生颜色,并根据规则更新状态。

  3. 变化检测:在每一天结束时,检查是否有学生的颜色发生了变化。如果没有变化,则说明达到了稳定状态。

  4. 时尚达人计算:在稳定状态下,遍历学生列表,计算与相邻学生颜色不同的学生数量。

(三)代码实现

以下是实现上述思路的 Python 代码:

def solution(n, data):
    days = 0
    current = list(data)
    
    while True:
        next_state = current[:]
        changed = False
        
        for i in range(n):
            left = current[i - 1]
            right = current[(i + 1) % n]
            if current[i] == left == right:
                next_state[i] = '1' if current[i] == '0' else '0'
                changed = True
        
        days += 1
        current = next_state
        
        if not changed:
            break
        
        if days > n:  # If it takes more than n days, it will never stabilize
            return [-1, -1]
    
    fashionistas = sum(1 for i in range(n) if current[i] != current[i - 1] 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])

(四)代码解析

  1. 初始化:我们首先将输入的字符串转换为列表,以便于后续的状态更新。days 变量用于记录经过的天数。

  2. 状态更新循环:使用 while True 循环来不断更新学生的状态。每次循环开始时,创建一个 next_state 列表来存储下一天的状态。

  3. 状态变化判断:通过遍历每个学生,检查其左右邻居的颜色。如果相同,则更新该学生的颜色,并标记 changedTrue

  4. 稳定性检查:如果在某一天没有学生的颜色发生变化,则跳出循环,表示达到了稳定状态。

  5. 时尚达人计算:在稳定后,使用列表推导式计算与相邻学生颜色不同的学生数量。

  6. 返回结果:最后返回一个包含天数和时尚达人数量的列表。

(五)注意事项

  1. 边界条件:在处理循环结构时,特别要注意边界条件的处理,确保不会出现数组越界的情况。

  2. 性能考虑:虽然在最坏情况下,算法的时间复杂度为 O(n^2),但由于 n 的值通常不会很大,因此在实际应用中性能是可以接受的。

  3. 输入验证:在实际应用中,应该对输入数据进行验证,确保 n 是正整数,data 是由 0 和 1 组成的字符串。

(六)心得与体会

通过这个问题的分析与解决,我深刻体会到以下几点:

  1. 问题建模的重要性:在解决问题之前,首先要对问题进行充分的分析和建模。理解问题的本质和约束条件是找到解决方案的关键。

  2. 循环结构的处理:在处理循环结构时,特别是涉及到相邻元素的情况,必须小心处理边界条件,以避免潜在的错误。

  3. 模拟与迭代:许多问题可以通过模拟和迭代的方式来解决。在这个问题中,通过逐天模拟学生的校服变化,最终得到了稳定状态。

  4. 代码的可读性:在编写代码时,保持代码的可读性和清晰性是非常重要的。适当的注释和结构化的代码可以帮助他人(或未来的自己)更好地理解代码的逻辑。

(七)实际应用
这个问题的实际应用场景可以扩展到许多领域,例如社交网络中的信息传播、流行趋势的变化等。在这些场景中,个体的行为会受到周围环境的影响,如何模拟这种动态变化是一个有趣且具有挑战性的任务。 总之,这个问题不仅锻炼了我的编程能力,也让我对动态系统的模拟有了更深的理解。希望在未来的学习和工作中,能够将这些经验应用到更复杂的实际问题中。