You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用groupby的有序列表元素计数:线性时间单循环方案问询

单循环线性时间解决方案(适配有序列表)

当然有!而且刚好你的列表是有序的(相同元素连续排列),我们完全可以用一个高效的单循环线性时间方案来实现,完美适配PyPy的运行环境——毕竟简单循环在PyPy里的加速效果拉满。

实现代码

def count_consecutive_occurrences(L):
    # 处理空列表的边界情况
    if not L:
        return []
    
    counts = []
    current_value = L[0]
    current_count = 1
    
    # 从第二个元素开始遍历
    for num in L[1:]:
        if num == current_value:
            current_count += 1
        else:
            # 遇到不同元素,把当前计数存入结果
            counts.append(current_count)
            current_value = num
            current_count = 1
    # 别忘了添加最后一组元素的计数
    counts.append(current_count)
    
    return counts

为什么这个方案高效?

  • 时间复杂度是O(n):整个过程只遍历列表一次,没有嵌套循环或者重复遍历(不像你之前用L.count()的实现,每次count都会重新扫一遍整个列表,最坏情况时间复杂度是O(n²))。
  • 空间复杂度低:只用到了几个变量和结果列表,没有额外的哈希表或者集合开销,PyPy执行起来会非常快。
  • 逻辑简单:利用有序列表的特性——相同元素必然连续,只需要跟踪当前元素和它的计数,遇到新元素就收尾上一组的计数,完全符合你的需求。

测试你的示例

输入:L = [5,5,7,7,7,7,9,10,12,14]
输出:[2,4,1,1,1,1],和预期完全一致。

内容的提问来源于stack exchange,提问作者Simd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:21:26