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

138 阅读3分钟

问题描述

小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"


吐槽:典中典之测试用例与题目描述不符,记得按照题目给出的样例输入与输出写代码。


解法

这题不需要用到复杂算法,遍历一遍盘子序号,加点逻辑判断就行,算是简单题中的简单题,唯一的难点应该是输出格式要改成字符串。

基本思路:

  • 初始化结果列表:创建一个空列表 result,用于存放处理后的盘子序号。

  • 遍历盘子序号:用一个循环遍历 plates,同时使用两个指针 startend 表示当前连续递增子序列的起点和终点。

  • 构造连续序列:在遍历过程中,检查当前元素是否与上一个元素连续递增。如果是,将 end 指针后移,否则结束当前序列。

  • 判断序列长度:当找到一个序列结束时,判断序列长度是否至少为3:

    • 如果是,将 startend 的范围格式化为 "start-end" 并加入 result
    • 如果不是,将该序列的每个元素单独加入 result
  • 处理最后一个序列:遍历结束后,单独处理最后一个序列,按照长度进行判断和加入 result

  • 输出格式化:将 result 列表用逗号连接成字符串返回。

python代码

def solution(plates, n):
    result = []
    start = 0
    end = 0
    for i in range(1, len(plates)):
        if plates[i] == plates[end] + 1:
            end = i
        else:
            if end - start >= 2:
                result.append(f"{plates[start]}-{plates[end]}")
            else:
                result.extend(str(plates[j]) for j in range(start, end + 1))
            start = i
            end = i
    if end - start >= 2:
        result.append(f"{plates[start]}-{plates[end]}")
    else:
        result.extend(str(plates[j]) for j in range(start, end + 1))
    return ",".join(result)

if __name__ == "__main__":
    print(solution([-3, -2, -1, 2, 10, 15, 16, 18, 19, 20], 10))
    print(solution([-6, -3, -2, -1, 0, 1, 3, 4, 5, 7, 8, 9, 10, 11, 14, 15, 17, 18, 19, 20], 20))  
    print(solution([1, 2, 7, 8, 9, 10, 11, 19], 8))