Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Javascript获取数组中最接近目标值的重复值?_Javascript_Arrays_Algorithm - Fatal编程技术网

如何使用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当问题类似于硬币兑换时,筛子总是一个选项,尤其是当值为它们很小。