一种有效的算法,用于查找街道对面的门牌号码



我正在尝试用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

最新更新