Javascript 求街道对侧门牌号的一种有效算法

Javascript 求街道对侧门牌号的一种有效算法,javascript,algorithm,performance,Javascript,Algorithm,Performance,我正试图用JavaScript编写一个有效的算法来解决这个问题。请参阅以下输入数据、正确结果和我的低效解决方案的示例 街道示例 1| |6 3| |4 5| |2 左侧的奇数门牌号减少,右侧的偶数门牌号增加。门牌号从1开始,无空隙地增加 作为输入,我有一个门牌号(a)和街道长度(n)。我必须找到街对面的门牌号 getOppositeHouse(a, n) getOppositeHouse(1, 3) = 6 getOppositeHouse(3, 3) = 4 getOpposit

我正试图用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)];
}
函数getOppositeHouse(a,n){
让housesL=[],housesR=[];

对于(设i=1;i相反门牌号之和为常数,等于
2n+1

1 + 6
3 + 4
5 + 2
因此,您只需从中减去
a
,即可得到相反的门牌号:

函数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
相对房屋编号的总和是常数,等于
2n+1

1 + 6
3 + 4
5 + 2
因此,您只需从中减去
a
,即可得到相反的门牌号:

函数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
使用一些数学,而不是循环,例如,如果给定的房屋编号是奇数,我们通过公式
(a+1)/2)知道它是街道上的哪栋房屋
,然后考虑到房屋在另一边是相反的,我们需要
n-(a+1)/2+1
偶数侧的第栋房屋,它给出了公式
(n-(a+1)/2+1)*2
,我们可以对偶数的房屋编号案例使用类似的推理在我的国家,街道两侧的房屋编号以相同的方向增加?@Bergi在逻辑国家;)而不是使用循环使用一些数学,即,如果给出的房屋编号是奇数,我们可以通过公式
(a+1)知道街道上是哪栋房屋/2) 
,然后考虑到房子在另一边是相反的,我们需要
n-(a+1)/2+1
在偶数边的第二所房子,这给了我们公式
(n-(a+1)/2+1)*2
,我们可以对偶数的门牌号案例使用类似的推理在我的国家,街道两旁的门牌号以相同的方向增加?@Bergi在逻辑国家。;)