假設我們有一個用兩個元素的陣串列示的范圍串列[from, to]。
當我們添加一個新的陣列范圍時[5,8],它應該檢查List是否有最接近的范圍,然后用新的范圍值替換它。下面提供了一個示例:
示例 1
var List = [[1,2], [3,4], [6,7], [9,10]]
var newData = [5,8]
預期輸出:
[[1,2], [3,4], [5,8], [9,10]]
該[6,7]范圍已包含在[5,8]
示例 2
var List = [[1,3], [4,6], [8,10]]
var newData = [5,9]
預期輸出:
[[1,3], [4,10]]
uj5u.com熱心網友回復:
假設初始串列格式良好,其對已排序且不重疊,您可以使用二分搜索來查找陣列中新對的端點,從而確定任何重疊。如果重疊,則相應地拼接陣列:
function addSegments(segments, ...pairs) {
for (let pair of pairs) {
let [start, end] = pair.map(function (x, i) { // Binary search
let low = 0,
high = segments.length;
side = 1 - i;
while (low < high) {
let mid = (low high) >> 1;
if (x < segments[mid][side]) high = mid;
else low = mid 1;
}
return low - (side && segments[low-1]?.[side] === x);
});
if (start < end) {
pair = [
Math.min(segments[start][0], pair[0]),
Math.max(segments[end-1][1], pair[1])
];
}
segments.splice(start, end - start, pair);
}
}
// Demo
let list = [[1, 2], [3, 4], [6, 7], [9, 10]];
addSegments(list, [5, 8]);
console.log(JSON.stringify(list));
list = [[1, 3], [4, 6], [8, 10]];
addSegments(list, [5, 9]);
console.log(JSON.stringify(list));
uj5u.com熱心網友回復:
如果我們有兩個陣列,其中包含范圍內的所有整數,那么我們可以相交并查看它們是否重疊。如果他們這樣做,我們從兩個范圍的并集創建一個新范圍,并在輸出中使用它。
為此,我們定義了三個輔助函式,range()、intersect() 和 union(),然后我們使用它們來生成輸出陣列。如果存在交集,我們會用兩者的新并集覆寫任何重疊的范圍。我假設如果兩個范圍剛剛接觸,它們就不會被合并,所以只有當交叉點包含多個元素時才會觸發覆寫。另外,我添加了一個初始排序。
function add(list, data) {
let buffer = [], idx;
const range=(a,b)=>Array.from({length:b-a 1}, (_, i)=>(a i));
const intersect=(a,b)=>a.filter(x=>b.includes(x));
const union=(a,b)=>[...new Set([...a, ...b])].sort((a,b)=>a-b);
list.sort((a,b)=>a[0]-b[0]);
list.forEach(el=>{
let x = range(el[0], el[1]);
let y = range(data[0], data[1]);
let i = intersect(x, y);
if(i.length>1) {
let d = union(x,y);
data = [d[0], d[d.length-1]];
if(idx) { buffer[idx] = data; }
else { idx = buffer.push(data)-1; }
}
else { buffer.push(el); };
});
return buffer;
}
// DEMO
let List = [[1,2], [3,4], [6,7], [9,10]];
let newData = [5,8];
console.log(JSON.stringify(List));
console.log(JSON.stringify(newData));
console.log(JSON.stringify(add(List, newData)));
console.log('');
List = [[1,3], [4,6], [8,10]];
newData = [5,9];
console.log(JSON.stringify(List));
console.log(JSON.stringify(newData));
console.log(JSON.stringify(add(List, newData)));
console.log('');
// DEMO WITH UNORDERED ELEMENTS
List = [[3,4], [9,10], [6,7], [1,2]];
newData = [5,8];
console.log(JSON.stringify(List));
console.log(JSON.stringify(newData));
console.log(JSON.stringify(add(List, newData)));
console.log('');
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/321533.html
標籤:javascript 数组 多维数组
