叠盘子排序|豆包MarsCode AI刷题

0 阅读3分钟

1.题目

问题描述

小M有一个独特的方式来收拾家中的盘子。每次用餐后,他会将盘子按照他们的序号顺序叠放。盘子的序号都是唯一的整数,并且在收拾前就是递增的。小M的叠放规则是,每一堆盘子的序号都是连续递增的,并且至少包含3个盘子。需要编写程序帮助小M确定盘子的叠放方式。

例如,输入的盘子序号是 [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20],按照小M的规则,连续递增序列 -3, -2, -1 可以叠在一起表示为 -3--1,而 18, 19, 20 可以叠在一起表示为 18-20。不满足连续递增至少3个的,如 2, 10, 15, 16 都应单独列出。


输入参数

  • plates: 一个整数数组,表示盘子的序号
  • n: 盘子总数

测试样例

样例1:

输入:plates = [-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], n = 10 输出:"-3--1,2,10,15,16,18-20"

样例2:

输入:plates = [-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], n = 20 输出:"-6,-3-1,3-5,7-11,14,15,17-20"

样例3:

输入:plates = [1, 2, 7, 8, 9, 10, 11, 19], n = 8 输出:"1,2,7-11,19"

2.思路

  • 遍历 plates 数组,找到每段连续递增的序列。
  • 如果序列长度达到3个或以上,将其格式化为 起点-终点
  • 如果长度不足3个,将每个元素单独添加到结果中。
  • 最后使用 ",".join 拼接成字符串并返回。

3.代码

def solution(plates: list[int], n: int) -> str:
    # Please write your code here
    result = []
    start = 0
    for i in range(1, n + 1):
        # 一直往后遍历,直到不连续或者到最后一个
        if i == n or plates[i] != plates[i - 1] + 1:
            if i - start >= 3:
                result.append(f"{plates[start]}-{plates[i - 1]}")
            else:
                # 如果不够三个,逐个加入
                result.extend(map(str, plates[start: i]))
            start = i
    return ",".join(result)

if __name__ == "__main__":
    #  You can add more test cases here
    print(solution([-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], 10) == "-3--1,2,10,15,16,18-20" )
    print(solution([-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], 20) == "-6,-3-1,3-5,7-11,14,15,17-20")
    print(solution([1, 2, 7, 8, 9, 10, 11, 19], 8) == "1,2,7-11,19")
  • result.extend(map(str, plates[start:i]))

extend() 方法用于将一个可迭代对象(例如列表或迭代器)中的所有元素依次添加到 result 列表中。

例如,result = [],调用 result.extend(["-3", "-2", "-1"]) 后,result = ["-3", "-2", "-1"]

map(str, plates[start:i]) :使用 map 函数将 plates[start:i] 中的每个数字(整数类型)转为字符串。

4.总结

做这到题的时候偷了点小懒,没有特别明确流畅的思路,就去找了AI学习代码,其实还是应该基于思路自己去写代码,不应该直接去看现有的代码。