我有一个数字,计算离这个数字最接近的三个数字

例如,我的数字是15, 这里所有的数字有1,3,4,5,6,8,9,14,20,23,31,55,99
那么我得到的数字就是:14,20,9

就像地图,我要拿到离我这最近的三家酒店。

 var num=new Array(1,3,4,5,6,8,9,14,20,23,31,55,99)
var nearly=new Array(100,100,100);
function jisuan(){
    var base=15;
    var swap;
    for (var i = 0; i <num.length; i++) {
        var s=check(num[i],base)
        for(var j=0;j<nearly.length;j++){
            if(s<check(nearly[j],base))
            {
                swap=num[i];
                num[i]=nearly[j]
                nearly[j]=swap;
            }
        }
    }
}
function check(i,j){
    if(i>j){
    return i-j;
    }else{
        return j-i;
    }

}

把15分别减去这些数取绝对值,最小的3个就是最近的3个

先排序,再求差值;或者排完序后先用二分查找得到该值本该在序列中的位置,然后再查看两边的值。

这是JS写的,思路是遍历让数字先比较差值的大小,在遍历替换的思路,还有一个比较好的想法,你可以试一下,就是把你的数字直接插入到数组中去,先排序,然后找到你的数字,以数字为中心向两端遍历,算法可以优化很多,

for()循环计算每个数与其的差值
保存3个最小的即可

int a[13] = {1,3,4,5,6,8,9,14,20,23,31,55,99};
int b[2][3] ;
int result;
 for(int i=0;i<13;i++)
 {
   if(a[i]>15)                  //计算出差值
     {
       result = a[i]-15;
     }else if(a[i]<15)
     {
       result = 15-a[i];
     }else if(a[i]==15)
     {
       break;
     }

     if(i < 3)                                    //前三次初始化三个最小的数
     b[1][1] = a[i];b[1][2] = a[i];b[1][3] = a[i];
       b[2][1] = result;b[2][2] = result;b[2][3] = result;
        else
        {
          //从第四次差值跟前三个中差值最大的比较,若差值小于大的则替换掉
            if(a[2][1]>a[2][2]&&a[2][1]>a[2][3])
              {
                  if(a[2][1]>result)
                    {
                      a[2][1] = result;      //替换,当前差值
                        a[1][1] = a[i];          //当前数值
                    }
                }
        else if(a[2][2]>a[2][1]&&a[2][2]>a[2][3])
          {
              a[2][2] = result;      //替换,当前差值
                    a[1][2] = a[i];          //当前数值
            }else
            {
                a[2][3] = result;      //替换,当前差值
                    a[1][3] = a[i];          //当前数值
            }
        }
 }

 //执行完,最小的三个数分别为 b[1][1]  b[1][2]  b[1][3] 
int a[13] = {1,3,4,5,6,8,9,14,20,23,31,55,99};
int b[2][3] ;
int result;
 for(int i=0;i<13;i++)
 {
   if(a[i]>15)                  //计算出差值
     {
       result = a[i]-15;
     }else if(a[i]<15)
     {
       result = 15-a[i];
     }else if(a[i]==15)
     {
       break;
     }

     if(i < 3)                                    //前三次初始化三个最小的数
     {
           b[1][1] = a[i];b[1][2] = a[i];b[1][3] = a[i];
       b[2][1] = result;b[2][2] = result;b[2][3] = result;
      }  else
        {
          //从第四次差值跟前三个中差值最大的比较,若差值小于大的则替换掉
            if(a[2][1]>a[2][2]&&a[2][1]>a[2][3])
              {
                  if(a[2][1]>result)
                    {
                      a[2][1] = result;      //替换,当前差值
                        a[1][1] = a[i];          //当前数值
                    }
                }
        else if(a[2][2]>a[2][1]&&a[2][2]>a[2][3])
          {
              a[2][2] = result;      //替换,当前差值
                    a[1][2] = a[i];          //当前数值
            }else
            {
                a[2][3] = result;      //替换,当前差值
                    a[1][3] = a[i];          //当前数值
            }
        }
 }

 //执行完,最小的三个数分别为 b[1][1]  b[1][2]  b[1][3]