如何使用Javascript获取数组中最接近目标值的重复值?
如何使用Javascript获取数组中最接近目标值的重复值?,javascript,arrays,algorithm,Javascript,Arrays,Algorithm,//美元的简写形式(document).ready() $(函数(){ var SwitchesByNumberOfPorts=[48,24]; var目标=115; var Target_Copy=目标; var=[]; SwitchesByNumberOfPorts.forEach(函数(端口)){ while(目标拷贝>=端口){ 目标拷贝-=端口; needSwitches.push(端口); } }); var portsCalculated=needSwitches.reduce((
//美元的简写形式(document).ready()
$(函数(){
var SwitchesByNumberOfPorts=[48,24];
var目标=115;
var Target_Copy=目标;
var=[];
SwitchesByNumberOfPorts.forEach(函数(端口)){
while(目标拷贝>=端口){
目标拷贝-=端口;
needSwitches.push(端口);
}
});
var portsCalculated=needSwitches.reduce((a,b)=>a+b,0);
如果(已计算)
从高到低排序
sorted=vals.sort((a,b)=>b>a)
对于每个元素,从目标值中减去,直到不能再减去为止,并保持跟踪
sorted.forEach(v=>{
while(目标拷贝>=v){
目标拷贝-=v
需要推送(v)
}
})
然而,这将使最后一次购买需要关闭,所以在最后,检查您是否需要再次购买最小的
如果(target_copy>0){needs.push(sorted[sorted.length-1])
下面是一个js控制台,显示了它的实际操作:
function seek (set, target) {
let needs = []
let sorted = set.sort((a,b) => b>a)
sorted.forEach(v => {
while(target >= v) {
target -= v
needs.push(v)
}
})
if(target > 0) { needs.push(sorted[sorted.length - 1]) }
return needs
}
undefined
seek([48,24],115)
(3) [48, 48, 24]
您可以使用筛选。如果需要,将输入值从大到小排序,并创建一个空筛选:
{0:[]}
然后,对于输入中的每个值,迭代筛选中的值(包括您在本步骤中刚刚添加的值),并将值添加到这些值中,直到您达到或通过目标。在本例中,我们从48开始:
{0:[], 48:[48], 96:[48,48], 144:[48,48,48]}
对下一个值24执行相同操作:
{0:[], 24:[24], 48:[48], 72:[48,24], 96:[48,48], 120:[48,48,24], 144:[48,48,48]}
当您创建的新值(例如24+24=48)已存在时,不要替换它,以便使用最小数量的值,即48而不是24+24,48+24而不是24+24,等等
查看所有值后,取筛子中等于或大于目标值的第一项。在本例中,即:
120:[48,48,24]
对于示例输入[30,20,15]和目标35,这将是:
{0:[]}
{0:[], 30:[30], 60:[30,30]}
{0:[], 20:[20], 30:[30], 40:[20,20], 60:[30,30]}
{0:[], 15:[15], 20:[20], 30:[30], 35:[20,15], 40:[20,20], 60:[30,30]}
结果是:
35:[20,15]
注意:如果您偏好使用从高到低以外的值,只需在创建筛选之前按优先顺序对值进行排序;例如,使用[20,15,30]将导致65:[20,15,15,15],而不是65:[30,20,15].请参见基于Roberto对我的查询的回答我生成了这个小提琴示例。获取最接近目标的结果115您的解决方案速度快且“有效”,但不能提供最佳结果。例如搜索([30,20,15],35)
计算结果为[30,15]
而最佳解决方案为[20,15]
。感谢le_ám在我的情况下,我需要考虑最高端口交换机和roberto tomás提供的解决方案,这就是他首先按最高值排序的原因。感谢您的输入。伟大的解决方案!@roberto tomás当问题类似于硬币兑换时,筛子总是一个选项,尤其是当值为它们很小。