例如,我的数字是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]