扫码关注官方订阅号
有一个数组:
arr = [0.1,0.2,0.5,1,2,5,10,20,50,100,200,500,1000];
怎么确定任意一个0.1-1000之间的数接近arr中的哪个值?(比如30接近的数就是20)
小伙看你根骨奇佳,潜力无限,来学PHP伐。
一楼的答案很原始,其实直接把要比较的这个数push到那个数组里面去,然后sort排序,从小到大or从大到小都可以,检测这个数和前面一个数以及和后面一个数绝对值差哪个小,小的那个就是最接近的数,总共四行代码吧
逐个求差的绝对值,最小的那个不就是最接近的么,简单写了下
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一步搞定:
sort
假设要比较数是N,那么:
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];
既然题主说有序,那么直接二分查找
看下underscore 的sortBy
1.数组排序2.二分查找
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
一楼的答案很原始,其实直接把要比较的这个数push到那个数组里面去,然后sort排序,从小到大or从大到小都可以,检测这个数和前面一个数以及和后面一个数绝对值差哪个小,小的那个就是最接近的数,总共四行代码吧
逐个求差的绝对值,最小的那个不就是最接近的么,简单写了下
你的数组是有序的还是无序的?
如果是无序的,就从头查找,复杂度O(N):
如果是有序的,用二分查找,复杂度O(lgN):
用
sort
一步搞定:假设要比较数是
N
,那么:就是你要的结果。
既然题主说有序,那么直接二分查找
看下underscore 的sortBy
1.数组排序
2.二分查找