Dart实现Codewars街道房屋编号函数超时问题及优化需求
问题分析与优化方案
你的代码在小规模测试中能正常运行,但面对n高达5000亿的场景时,内存溢出和超时是必然结果——因为你通过列表存储所有奇偶编号,会占用O(n)的内存,循环遍历和indexOf操作也都是O(n)的时间复杂度,完全无法处理超大规模输入。
核心规律推导
先明确街道的排列逻辑:
- 街道两侧各有n栋房屋,总共有2n个连续编号(从1到2n)
- 左侧为奇数编号,按从大到小排列:
2n-1, 2n-3, ..., 1 - 右侧为偶数编号,按从小到大排列:
2, 4, ..., 2n
观察对面房屋的编号对应关系:所有正对的两个房屋编号之和是固定值。比如n=3时,1+6=7、3+4=7、5+2=7,这个固定值就是2n + 1。
因此不管输入的address是奇数还是偶数,对面的编号都可以用公式直接计算:(2 * n + 1) - address,完全不需要循环或列表存储。
优化后的Dart代码
int overTheRoad(int address, int n) { return 2 * n + 1 - address; }
验证示例
- 输入
(1, 3):2*3+1 -1 = 6,符合预期 - 输入
(3, 3):7-3 = 4,符合预期 - 输入
(2, 3):7-2 = 5,对应左侧的5,正确 - 输入
(6, 3):7-6 = 1,正确
这个方案的时间复杂度为O(1),空间复杂度也为O(1),无论n多大都能瞬间完成计算,彻底解决超时和内存问题。
内容的提问来源于stack exchange,提问作者hilmiberkayozdemir
相关产品推荐
相关产品推荐

