有一个数组:
arr = [0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000];
怎么确定任意一个0.1-1000之间的数接近arr中的哪个值?(比如30接近的数就是20)
有一个数组:
arr = [0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000];
怎么确定任意一个0.1-1000之间的数接近arr中的哪个值?(比如30接近的数就是20)
逐个求差的绝对值,最小的那个不就是最接近的么,简单写了下
function limit(arr, num){
var newArr = [];
arr.map(function(x){
// 对数组各个数值求差值
newArr.push(Math.abs(x - num));
});
// 求最小值的索引
var index = newArr.indexOf(Math.min.apply(null, newArr));
return arr[index];}
你的数组是有序的还是无序的?
如果是无序的,就从头查找,复杂度O(N):
function closest(arr, num){
var ret = arr[0];
var distance = Math.abs(ret - num);
for(var i = 1; i < arr.length; i++){
var newDistance = Math.abs(arr[i] - num);
if(newDistance < distance){
distance = newDistance;
ret = arr[i];
}
}
return ret;
}
如果是有序的,用二分查找,复杂度O(lgN):
function closest(arr, num){
var left = 0;
var right = arr.length - 1;
while(left <= right){
var middle = Math.floor((right + left) / 2);
if(right - left <= 1){
break;
}
var val = arr[middle];
if(val === num){
return middle;
}
else if(val > num){
right = middle;
}
else{
left = middle;
}
}
var leftValue = arr[left];
var rightValue = arr[right];
return rightValue - num > num - leftValue ? leftValue : rightValue;
}
用sort
一步搞定:
假设要比较数是N
,那么:
arr.sort(function(a, b) {
return Math.abs(a - N) - Math.abs(b - N);
})[0];
就是你要的结果。
var arr = [0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000,1,23,4,5,6,7,8]; //无所谓顺序
arr.sort(function(a,b){return a-b;}); // 从小到大排序
//比如查20
var index = arr.indexOf(20);
var result = 20-arr[index-1] < arr[index+1]-20 ? arr[index-1] : arr[index+1];
10 回答11.7k 阅读
2 回答3.2k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
3 回答840 阅读✓ 已解决
3 回答1k 阅读✓ 已解决
2 回答1.2k 阅读✓ 已解决
一楼的答案很原始,其实直接把要比较的这个数push到那个数组里面去,然后sort排序,从小到大or从大到小都可以,检测这个数和前面一个数以及和后面一个数绝对值差哪个小,小的那个就是最接近的数,总共四行代码吧