不使用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
相关产品推荐
相关产品推荐

