Hca*_*tek 19 javascript arrays algorithm math
我在javascript中有一个整数数组,[5,10,15,20,25,30,35]
当给出数字x时,如何在数组中找到最接近该数字的元素?
如果数字超过一个值,但不到下一个数字的一半,我会选择较小的值,如果它超过下一个数字的一半,我会选择更高的数字.
例如7将返回5,但8将返回10.我如何实现此目的?任何帮助或提示将不胜感激.我搜索过,找不到解决方案.我确信这有点普遍.
Cam*_*ron 28
可能最简单的事情是根据距参考值x的距离进行排序,然后取第一项.
内置Array.prototype.sort()函数可以采用比较函数,该函数将从数组中调用值对.然后,关键是简单地传入比较函数,该函数基于它们与参考值x的距离来比较两个值.
let x = 8;
let array = [5, 10, 15, 20, 25, 30, 35];
let closest = array.sort( (a, b) => Math.abs(x - a) - Math.abs(x - b) )[0];
Run Code Online (Sandbox Code Playgroud)
看到这个简单的演示.
Ray*_*nos 16
function getClosest(array, target) {
var tuples = _.map(array, function(val) {
return [val, Math.abs(val - target)];
});
return _.reduce(tuples, function(memo, val) {
return (memo[1] < val[1]) ? memo : val;
}, [-1, 999])[0];
}
Run Code Online (Sandbox Code Playgroud)
如果使用函数方法,则可以将集合映射到(值,距离)的元组,然后将该组元组减少到具有最小距离的元组.我们返回该元组中的值.
解释用法_.map.您将数组中的所有值映射到新值,该函数将返回新值的数组.在这种情况下,元组数组.
解释用法_.reduce.您将数组减少为单个值.你传入一个数组和一个备忘录.当您在阵列中移动时,备忘录是您的"运行计数器".在这种情况下,我们检查当前元组是否比备忘录更接近,如果是,则将其作为备忘录.然后我们在最后返回备忘录.
上面的代码片段依赖于underscore.js来删除功能样式javascript的细节
mar*_*cog 11
您的示例列表已排序.如果总是如此,则二进制搜索您的号码.如果你没有找到确切的数目,使二进制搜索通过检查各地,其中人数的两个数字结束掉就可以,并返回最接近的一次.小心所有数字都大于或者都小于目标数的边缘情况
如果列表并不总是排序,则通过列表跟踪最大数量<=目标数量和最小数量> =目标数量.返回最接近目标的那个.
在任何一种解决方案中,如果你在[1,3]中搜索2,你需要决定支持哪一方.
创建一个与原始数组大小相同的临时数组,并使用x和数组元素之间的差异填充它.
例如,让临时数组为temp [],原始数组为[]:
temp[i]=Math.abs(x-a[i]);
Run Code Online (Sandbox Code Playgroud)
然后,将 temp []中最小值的索引返回给用户.