仅使用一个循环javascript的数组中相同值之间的差异

时间:2017-06-05 05:22:01

标签: javascript

如何找到数组中相同值的最小和最大索引之间的差异,其中一个循环的复杂度恰好为O(N)?

例如,给定数组A:

[4, 6, 2, 2, 6, 6, 1];

该函数返回4.

3 个答案:

答案 0 :(得分:1)

我使用 reduce 来记住每个值的第一个索引,然后在我继续时更新最后一个值和最大值,例如。



var data = [4, 6, 2, 2, 6, 6, 1];

function getMaxIndexSpread(data) {
  return data.reduce(function(acc, value, index) {

    if (value in acc) {
      acc[value].lastIndex = index

    } else {
      acc[value] = {firstIndex: index, lastIndex: index};
    }
    var spread = acc[value].lastIndex - acc[value].firstIndex;

    if (acc.maxSpread < spread) acc.maxSpread = spread;

    return acc;
  }, {maxSpread: 0}).maxSpread;
}

console.log(getMaxIndexSpread(data));
&#13;
&#13;
&#13;

这可能是一种更加有趣的方式,但这对我来说很有意义。

&#13;
&#13;
var data = [4, 6, 2, 2, 6, 6, 1];

console.log(Math.max(...data.map((v,i) => i - data.indexOf(v)))); 
&#13;
&#13;
&#13;

答案 1 :(得分:0)

   var arr = [4, 6, 2, 2, 6, 6, 1];
    function test(arr) {
        var resultArr = [];
        arr.map(function (v, i, a) {
            for (var j = arr.length - 1; j >= 0; j--) {
                if (v == arr[j]) {
                    resultArr.push({value: v, result: j - i});
//                    console.log(v+'的折扣值'+(j-i));
                    break;
                }
            }
        })
        resultArr.sort(function (a, b) {
            return b.result - a.result;
        })
        console.log(resultArr[0])
    }
    test(arr);

答案 2 :(得分:0)

尝试使用Array#filter .filter数组,不要使用max和min值。然后在过滤后的数组中查找最大值。...spread syntax

var data = [4, 6, 2, 2, 6, 6, 1];

function bet(data) {
  return Math.max(...data.filter(a => a != Math.max(...data) && a != Math.min(...data)))
}

console.log(bet(data))