2

我编写了 Microsoft Excel 的MODE.MULT函数的一个相对复杂的实现,该函数返回一个数组中最常出现或重复的值的数组。它是用三个循环实现的,包括一个嵌套到另一个循环中,我怀疑有一种更简单的方法来解决它。有关信息,它使用Lo-Dash中的_.uniq从返回的数组中提取重复值。

function MODEMULT(range) {
  var n = range.length;
  var max = 0;
  var counts = new Array();
  var result = new Array();
  for (var i = 0; i < n; i++) {
    counts[i] = 0;
    for (var j = 0; j < n; j++) {
      if (range[j] === range [i]) {
        counts[i]++;
        max = (counts[i] > max) ? counts[i] : max;
      }
    }
  }
  for (var k = 0; k < n; k++) {
    if (counts[k] === max) {
      result.push(range[k]);
    }
  }
  return _.uniq(result);
}

出于测试目的,MODEMULT([1,2,3,4,3,2,1,2,3])应返回[2,3]

在此先感谢您的帮助!

4

1 回答 1

4

您可以使用更少的循环,尽管这会影响内存使用,因为您将计算原始范围内的所有唯一条目:

function MODEMULT(range) {
  var n = range.length,
      // object to hold the number of occurrences per entry
      count= {},
      // array to hold those numbers which have the current max occurrences 
      maxItems = [],
      // reference to the current maximum
      max = 0,
      // JSLint placement of currentItem used inside the loop
      currentItem;

  for (var i = 0; i < n; i++) {
    currentItem= range[i];

    // Update the occurrences table.
    count[currentItem] = count[currentItem] ? count[currentItem] + 1 : 1;

    // If a new maximum is created, void the original maxItems and update max.
    if (count[currentItem] > max) {
       max = count[currentItem];
       maxItems = [];
    }

    // If the entry reaches the current max, add it to maxItems.
    if (count[currentItem] === max) {
        maxItems[maxItems.length] = currentItem;
    }
  }

  // No need for unique, as a duplicate value
  // will increase max and thus empty out maxItems.
  return maxItems;
}
于 2013-01-04T17:26:27.790 回答