Scala中统计Long类型范围内奇数个数,遇Int.MaxValue元素数超限错误
解决Scala中Long范围奇数统计的"More than Int.MaxValue elements."错误
问题原因
Scala里的Range(包括Long类型的Range.Long)的size、length、count方法都是基于Int类型实现的,这意味着Range能容纳的元素数量上限是Int.MaxValue。哪怕你用by 2缩小步长,当n足够大时(比如n > 2 * Int.MaxValue + 1),Range的元素个数依然会超出Int的范围,触发More than Int.MaxValue elements.错误。
解决方案:用数学公式直接计算
根本不需要生成Range集合,通过数学规律就能直接得到结果,完全规避元素数量限制的问题:
- 若要统计**1到n(包含n)**的奇数个数:
比如n=7时,结果是4(对应奇数[1,3,5,7]);n=6时结果是3(对应[1,3,5])。def oddCount(n: Long): Long = { (n + 1) / 2 } - 若你的实际需求是统计**1到n-1(不包含n)**的奇数个数(匹配你给出的示例n=7输出3):
此时n=7时,7/2=3(对应[1,3,5]),符合示例预期。def oddCount(n: Long): Long = { n / 2 }
为什么这个方法更好
这种方式是O(1)时间复杂度,不需要构建任何集合,完全不会受Int范围限制,不管n多大都能正确返回Long类型的结果。
原代码问题分析
你之前的两种尝试:
(1L to n by 2L).size:即使步长为2,当n超过2 * Int.MaxValue + 1时,Range的元素个数依然会超过Int.MaxValue,触发错误。Range.Long(1L, n, 1L).count(_ % 2 != 0):count方法需要遍历Range元素,同样受限于Range的元素数量不能超过Int.MaxValue,而且遍历效率极低。
内容的提问来源于stack exchange,提问作者pragmatic learner
相关产品推荐
相关产品推荐

