Lambda Enumerable 分組處理
題目出處 Arcade > Thr Core > 88 Array Conversion
給定一個長度為2k的int Array,並執行以下算法:
第1.3.5...奇數次的計算,將Array中的數兩兩一組,取代為該2數相加的結果
第2.4.6...偶數次的計算,將Array中的數兩兩一組,取代為該2數相乘的結果
反覆執行此算法,直到Array只剩一個數,求此數是多少?
範例:
inputArray = [1, 2, 3, 4, 5, 6, 7, 8]
[1, 2, 3, 4, 5, 6, 7, 8] -> [3, 7, 11, 15] -> [21, 165] -> [186]
故arrayConversion(inputArray) = 186
這個情境中將元素分組的方式為兩兩一組,如[1, 2, 3, 4, 5, 6, 7, 8]被分為[1, 2] [3, 4] [5, 6] [7, 8]四組
與之前遇到的兩兩連續比對的情境不同
這次我使用的group by index的方式來實現分組,要將index=0,1的分在一組;index=2.3的又是一組
所以這邊所選的分組規則為群組代號=index/partSize
IEnumerable<IEnumerable<T>> div<T>(IEnumerable<T> a, int partSize)
{
return a.Select((x,idx) => new { val = x, gid = idx/partSize })
.GroupBy(x => x.gid)
.Select(g => g.Select(x => x.val));
}
分組的運作
之後就是完成算法部分,因為是兩兩一組,partSize給定2即可
相加與相乘的計算可透過聚總函數Aggregate完成
int arrayConversion(int[] a) {
int cnt = 1;
while(a.Length > 1)
{
if(cnt % 2 == 1){
a = div(a,2).Select(x => x.Aggregate(0, (cs, e) => cs + e)).ToArray();
}
else {
a = div(a,2).Select(x => x.Aggregate(1, (cs, e) => cs * e)).ToArray();
}
cnt++;
}
return a[0];
}
參考