我正在嘗試創建一個函式,該函式將 4 個嵌套串列作為輸入并回傳 4 個輸入串列組合成方形的單個聯合嵌套串列。第一個串列是左上角,第二個串列是右上角,第三個是左下角,第四個是右下角。請注意,所有 4 個串列的長度將始終相同。此外,內部串列中的元素數量將始終等于內部串列的數量。
例如,如果輸入是:list1=[[1,2], [3,4]], list2=[[2,1], [4,3]], list3=[[3,4], [ 1,2]], list4=[[4,3], [2,1]]
輸出將是 [[1,2,2,1], [3,4,4,3], [3,4,4,3], [1,2,2,1]] 因為它會被可視化作為:
List1 List2
[1,2] [2,1]
[3,4] [4,3]
List3 List4
[3,4] [4,3]
[1,2] [2,1]
現在,我能想出的偽代碼如下:
function combine(l1, l2, l3, l4):
list final = [];
for (int i = 0; i < (l1.length * 2; i ):
list new = [];
for (int j = 0; j < l1.length; j ):
new.append(i'th list[j]);
final.append(new);
return final;
我似乎無法弄清楚如何訪問正確陣列的正確元素來執行此操作,因為此函式應該對任何 2^n * 2^n 陣列集正確執行。
任何幫助將不勝感激!
uj5u.com熱心網友回復:
我看不到您已指定任何語言要求,因此即使您的串列示例表明您可能未使用C#,我仍會建議C#使用 Linq 操作Enumerable.Concat()和Enumerable.Zip().
(希望這個想法可能會有所幫助,即使您不能使用特定的實作。)
思路如下:
- 連接 list1 和 list2 的元素(逐個元素)
- 連接 list3 和 list4 的元素(逐個元素)
- 將第一步得到的結果與第二步得到的結果連接起來
使用該操作時,具有相同長度的串列的元素級連接是直截了當的.Zip(),因為它允許您對兩個序列進行元素級操作。在這種方法中,我使用了采用兩個序列并定義結果選擇器的多載。結果選擇器允許您定義應該對兩個序列的每個元素對執行的操作。
“正方形組合”可以如下生成:
List<List<int>> squareCombined = list1
.Zip(list2, ( el1, el2 ) => el1.Concat(el2).ToList())
.Concat(list3
.Zip(list4, ( el3, el4 ) => el3.Concat(el4).ToList()))
.ToList();
在第一個.Zip()操作中,序列是list1和list2。結果選擇器是
( el1, el2 ) => el1.Concat(el2).ToList()
,其中el1參考來自的元素list1并el2參考來自的元素list2。el1并且el2在它們各自的序列中總是有相同的索引。
在您提供的示例中,list1如下list2所示:
{ { 1, 2 }, { 3, 4 } } // list1
{ { 2, 1 }, { 4, 3 } } // list2
對于第一個操作中的第一個元素對.Zip(),結果選擇器因此產生:
// ( { 1, 2 }, { 2, 1 } ) => { 1, 2 }.Concat({ 2, 1 }).ToList()
{ 1, 2, 2, 1 }
同樣,對于第一個操作中的第二個元素對.Zip(),結果選擇器產生:
// ( { 3, 4 }, { 4, 3 } ) => { 3, 4 }.Concat({ 4, 3 }).ToList()
{ 3, 4, 4, 3 }
第一個.Zip()操作的回傳值是IEnumerable<List<int>>包含這兩個串列的:
{
{ 1, 2, 2, 1 },
{ 3, 4, 4, 3 }
}
通過對和執行相同的.Zip()操作,然后連接兩個結果物件,您可以獲得一個集合。list3list4IEnumerable<List<int>>
此實作使用System,System.Collections.Generic和System.Linq命名空間。
示例小提琴在這里。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/450550.html
上一篇:如何創建一個接受兩個引數(numRows、numColumns)并回傳具有正確網格值的二維陣列的JavaScript函式?
