Lambda Enumerable 分組處理

  • 93
  • 0

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];
}

參考

https://codesignal.com/