如何找到数组中相同值的最小和最大索引之间的差异,其中一个循环的复杂度恰好为O(N)?
例如,给定数组A:
[4, 6, 2, 2, 6, 6, 1];
该函数返回4.
答案 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;
这可能是一种更加有趣的方式,但这对我来说很有意义。
var data = [4, 6, 2, 2, 6, 6, 1];
console.log(Math.max(...data.map((v,i) => i - data.indexOf(v))));
&#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))