创建由每个子数组的最大值组成的数组无法按预期工作

Posted

技术标签:

【中文标题】创建由每个子数组的最大值组成的数组无法按预期工作【英文标题】:Creating an array consisting of the largest values of each sub-array does not work as expected 【发布时间】:2015-12-17 04:56:25 【问题描述】:

找到每个子数组中的最大数,然后将这些最大数组成一个数组。[[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]

我写了一些代码,但我不知道它有什么问题。也许 Array.push() 方法不起作用或者 for 循环。

function largestOfFour(arr) 
    var main = [];
    for(k=0;k<arr.length;k++)
       var long= 0;
         for(i=0;i<arr[k].length;i++)
            if(arr[k][i]<long) 
                arr[k][i] = long;
            
            main.push[long];
        
    
    return main


largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]], "");

【问题讨论】:

您需要为每个 k 循环重置 long ...即将 var long=0 移动到 for k 循环的顶部 请不要更正问题中的代码。 【参考方案1】:

问题出在内部循环上,当您尝试查找每个数组的最大值时。在外循环的每次迭代中,您应该重置long = arr[k][0]。不应将其重置为 0,因为最大值可能小于 0。请注意,这要求所有子数组至少具有一项。

正如@edc65 所指出的,long 的声明应该出现在函数的开头,以明确long 作为所有局部变量都具有函数范围。


每个子数组只需要一个值。因此,您应该为外循环的每次迭代添加一个值(main.push 应该在外循环中)。目前的方式是,您为每个子数组元素添加一个值。


在 if 语句中,你的赋值是倒置的。应该是

long = arr[k][i];

而且条件也颠倒了。 long 存储每个子数组的最大值。因此,如果您发现一个值大于,则更新它:

if(arr[k][i]>long) 
    long = arr[k][i];


当推入数组时使用括号,而不是括号:

main.push(long);

括号用于调用方法。括号用于访问对象中的属性。

最终代码

function largestOfFour(arr) 
    var main = [];
    var long;
    for(k=0;k<arr.length;k++)
       long = arr[k][0];
         for(i=0;i<arr[k].length;i++)
            if(arr[k][i]>long) 
                long = arr[k][i];
            
        
        main.push(long);
    
    return main;


Math.max方法

您可以使用Math.max 来简化您的代码

function largestOfFour(arr) 
    var main = [];
    for(k=0;k<arr.length;k++)
        var long = Math.max.apply(null, arr[k]);
        main.push(long);
    
    return main;

根据@BillyMoon's 和@Tushar's 的回答,这可以进一步简化为Array.map 调用。

【讨论】:

当你重置它时,我会选择 long = arr[k][0] 而不是 long = 0。这将处理数字都是负数的情况。 在 for 中包含 var long... 也是一个(次要)问题。所有局部变量都在函数范围内,应在顶部声明。相反,似乎在 for() 的范围内很长,这不是【参考方案2】:

我知道这里的问题是找到现有代码中的错误,以防您可能想要优化代码

原来的idea 是@thefourtheye。我只是在这里解释一下。

无需嵌套循环,单行即可实现。

var arr = [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]];

var result = arr.map(Math.max.apply.bind(Math.max, null));

document.write(result);
console.log(result);

这是如何工作的?

array.map 函数正在迭代调用它的数组中的每个元素。 这里传递给map 的函数是apply,其this 上下文绑定到Math.max,第一个参数绑定到null

Math.max.apply.bind(Math.max, null) 这基本上将数组上的Math.max 函数称为

Math.max.apply(null, array);

更新:

使用 ES6,arrow function 和 spread operator,这可以做得更小

arr.map(e => Math.max(...e))

var arr = [[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]];

var result = arr.map(e => Math.max(...e));

document.write(result);
console.log(result);

【讨论】:

【参考方案3】:

实现相同结果的可能更简单的方法 - 简单性是可靠性的先决条件...

function largestOfFour(arr)
    // assumes compatible browser, or shim: https://developer.mozilla.org/en/docs/Web/javascript/Reference/Global_Objects/Array/map#Browser_compatibility
    // map array each element into new value based on callback's return
    return arr.map(function(subarr)
        // sort to get highest value at front, and then return it
        return subarr.sort(function(a,b)
            return b-a;
        )[0];
    );


或使用 Math.max(参见 cmets...)

function largestOfFour(arr)
    // assumes compatible browser, or shim: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map#Browser_compatibility
    // map array each element into new value based on callback's return
    return arr.map(function(subarr)
        // sort to get highest value at front, and then return it
        return Math.max.apply(null, subarr);
    );

【讨论】:

您应该使用Math.max 而不是对数组进行排序(出于效率和不变性的原因)【参考方案4】:

我已经通过代码并以其他解决方案结束。第一个 for 循环遍历大数组,第二个循环遍历子数组的组件。

function largestOfFour(arr) 
  var main = [];
  for(k=0;k<arr.length;k++)
     var long=0;
       for(i=0;i<arr[k].length;i++)
          if(long<arr[k][i]) 
              long=arr[k][i];
          
       
   main.push(long);
   
  return main;

【讨论】:

以上是关于创建由每个子数组的最大值组成的数组无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Pixmap无法按预期工作 - LibGdx

扩展语法无法按预期与对象数组一起工作

光线投射和二维阵列在 Unity 中的魔方无法按预期工作

LeetCode 0813. 最大平均值和的分组

LeetCode 0813. 最大平均值和的分组

在 C++ 中对整数数组进行线性搜索时,SSE 比较无法按预期工作