Kotlin:如何以O(1)时间复杂度获取IntRange的元素数量?
Kotlin中O(1)时间获取IntRange的元素数量
当然有,直接用算术计算就行,完全不用循环或者转列表,时间复杂度是O(1)。
核心计算逻辑
IntRange是闭区间(同时包含start和end),所以元素数量的计算公式很明确:
- 如果
start <= end,数量为end - start + 1 - 如果
start > end,这是个空范围,数量直接为0
可以封装成一个工具函数,用起来更顺手:
fun IntRange.elementCount(): Int { return if (start > end) 0 else end - start + 1 }
测试几个例子验证:
IntRange(1, 5).elementCount()返回5,和循环计数结果完全一致IntRange(10, 3).elementCount()返回0,对应空范围的情况
关于toList().size的问题
你担心的内存问题是真实存在的,而且这个方法也不符合O(1)的要求:
- 调用
toList()会把范围里的所有元素都实例化并存到List中,如果范围很大(比如0到100万),会瞬间占用大量内存,甚至可能触发内存溢出 - 生成List的过程需要遍历整个范围,时间复杂度是O(n),完全达不到你要的高效要求,所以这个方法绝对不推荐用。
内容的提问来源于stack exchange,提问作者ModdyFire
相关产品推荐
相关产品推荐

