我正在尝试用JavaScript编写一个高效的算法来解决这个任务。请参阅以下输入数据、正确结果和我的低效解决方案的示例。
街道示例
1| |6
3| |4
5| |2
奇数房屋数量在左侧减少,偶数房屋数量在右侧增加。房屋数量从1开始,并无间隙地增加。
作为输入,我有一个门牌号(a(和街道长度(n(。我必须找到街对面的门牌号码。
getOppositeHouse(a, n)
getOppositeHouse(1, 3) = 6
getOppositeHouse(3, 3) = 4
getOppositeHouse(2, 3) = 5
getOppositeHouse(3, 5) = 8
我当前的解决方案
function getOppositeHouse(a, n) {
let housesL = [], housesR = [];
for (let i = 1; i <= 2 * n; i += 1)
if (i % 2) housesL = [...housesL, i];
else housesR = [i, ...housesR];
if (housesL.includes(a)) return housesR[housesL.indexOf(a)];
else return housesL[housesR.indexOf(a)];
}
在我的电脑上,a=20和n=100000的执行时间为138.7秒。请帮助我创建一个更有效的解决方案。
相对房屋编号之和为常数,等于2n + 1
。
1 + 6
3 + 4
5 + 2
所以,你只需要从中减去a
,就可以得到相反的门牌号:
function getOppositeHouse(a, n) {
console.log(2 * n + 1 - a)
}
getOppositeHouse(1, 3) // 6
getOppositeHouse(3, 3) // 4
getOppositeHouse(2, 3) // 5
getOppositeHouse(3, 5) // 8