繁体   English   中英

查找数组中给定元素的下一个最高位置

[英]find the position of the next highest of the given element in an array

我有一个降序排序的数组,如果在数组中找到,我需要获取给定元素的位置,如果没有找到,则返回下一个更高元素的位置。 例如

如果我们通过 [10,11,10],预期的结果是 [12, 12, 12] 因为 10<12 && 11<12 && 10<12

因此一共

var arr = [
    [18, 12, 6],
    [16, 12, 9],
    [15, 11, 6],
    [14, 10, 7],
    [13, 12, 4],
    [13, 11, 2],
    [12, 12, 12],
    [12, 12, 7],
    [12, 10, 9],
    [12, 9, 6],
    [12, 9, 2],
    [12, 8, 8],
    [11, 9, 1],
    [10, 10, 10],
    [9, 7, 3],
    [8, 6, 5],
    [6, 6, 6],
    [6, 4, 4],
    [4, 4, 4]
];

var g = [10,11,10];
var a=[],b=[],c=[];

for(var i = 0; i<arr.length; i++)
{
    a.push(arr[i][0]);
    b.push(arr[i][1]);
    c.push(arr[i][2]);
}

console.log(getPos(g)) // expected result is [12,12,12]

只要数组按降序排序,解决这个问题的最简单方法可能就是向后迭代数组,直到找到一个子数组,其元素都大于或等于输入数组中的每个元素:

 const arr = [ [18, 12, 6], [16, 12, 9], [15, 11, 6], [14, 10, 7], [13, 12, 4], [13, 11, 2], [12, 12, 12], [12, 12, 7], [12, 10, 9], [12, 9, 6], [12, 9, 2], [12, 8, 8], [11, 9, 1], [10, 10, 10], [9, 7, 3], [8, 6, 5], [6, 6, 6], [6, 4, 4], [4, 4, 4] ]; function getPos(arr, inp) { for (i = arr.length - 1; i >= 0; i--) { if (arr[i][0] >= inp[0] && arr[i][1] >= inp[1] && arr[i][2] >= inp[2]) { return arr[i]; } } } console.log(getPos(arr, [10, 11, 10])); console.log(getPos(arr, [10, 10, 10])); console.log(getPos(arr, [1, 1, 1]));

您可以使用Array.reduce更简洁地编写此代码,但这有一个缺点,即即使在找到结果之后,也会触及数组中的每个元素:

const getPos = (inp) => arr.reverse().reduce((c, v) =>
  !c && v[0] >= inp[0] && v[1] >= inp[1] && v[2] >= inp[2] ? v : c, null);

如果数组未排序,也可以修改这段代码以使其工作。 在这种情况下,由于必须查看所有元素,因此使用reduce没有任何损失:

 const arr = [ [16, 12, 9], [11, 9, 1], [15, 11, 6], [6, 6, 6], [13, 12, 4], [4, 4, 5], [13, 11, 2], [18, 12, 6], [12, 12, 12], [12, 12, 7], [12, 10, 9], [12, 9, 6], [12, 9, 2], [12, 8, 8], [14, 10, 7], [10, 10, 10], [9, 7, 3], [8, 6, 5], [6, 4, 4], [4, 6, 4] ]; const getPos = (inp) => arr.reduce((c, v) => v[0] >= inp[0] && v[1] >= inp[1] && v[2] >= inp[2] && (!c || v[0] < c[0] || v[0] == c[0] && v[1] < c[1] || v[0] == c[0] && v[1] == c[1] && v[2] < c[2]) ? v : c, null); console.log(getPos([10, 11, 10])); console.log(getPos([10, 10, 10])); console.log(getPos([1, 1, 1]));

我希望我有所帮助

 var arr = [ [18, 12, 6], [16, 12, 9], [15, 11, 6], [14, 10, 7], [13, 12, 4], [13, 11, 2], [12, 12, 12], [12, 12, 7], [12, 10, 9], [12, 9, 6], [12, 9, 2], [12, 8, 8], [11, 9, 1], [10, 10, 10], [9, 7, 3], [8, 6, 5], [6, 6, 6], [6, 4, 4], [4, 4, 4] ]; var g = [10, 11, 10]; // -> [12, 12, 12] for (i = arr.length - 1; i >= 0; i--) { if (arr[i][0] >= g[0] && arr[i][1] >= g[1] && arr[i][2] >= g[2]) { console.log(i, arr[i]); } }

鉴于数组可以按任何顺序排列 - 您的评论:不需要逆序,任何东西都有效,您将需要遍历数组并跟踪下一个高于给定 g 值的项目。 如果找到 g,则返回其位置。 如果未找到 g,则返回找到的下一个最高项。 剩下的唯一问题是如果没有找到 g 并且没有所有三个值 >= 所有三个 g 值的条目,该怎么办。

就像是:

 var arr = [ [16, 12, 9], [11, 9, 1], [15, 11, 6], [6, 6, 6], [13, 12, 4], [4, 4, 5], [13, 11, 2], [18, 12, 6], [12, 12, 12], [12, 12, 7], [12, 10, 9], [12, 9, 6], [12, 9, 2], [12, 8, 8], [14, 10, 7], [10, 10, 10], [9, 7, 3], [8, 6, 5], [6, 4, 4], [4, 6, 4] ]; //var g = [10,11,10]; //var g = [13,11,10]; //var g = [5, 6, 7]; var g = [1,1,1]; var found = false; var pos = 0; var last = []; for (let i = 0; i < arr.length; i++) { if (arr[i][0] == g[0] && arr[i][1] == g[1] && arr[i][2] == g[2]) { found = true; pos = i; break; } else if (arr[i][0] >= g[0] && arr[i][1] >= g[1] && arr[i][2] >= g[2]) { if (last.length == 0) { last = arr[i]; pos = i; } else if (arr[i][0] < last[0]) { last = arr[i]; pos = i; } else if (arr[i][0] == last[0] && arr[i][1] < last[1]) { last = arr[i]; pos = i; } else if (arr[i][0] == last[0] && arr[i][1] == last[1] && arr[i][2] < last[2]) { last = arr[i]; pos = i; } } } if (found) { console.log(g, " found at " + pos); } else if (last.length == 0) { console.log(g, " NOT found and no entry has all three values that are higher"); } else { console.log(g, " NOT found, next highest is " + last + " at position " + pos); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM