微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

嵌套列表 C# 的对角线差

如何解决嵌套列表 C# 的对角线差

我试图从一个函数获取嵌套列表绝对差异我有一个固定的矩阵,我想在不固定时得到 result。目前我有一个 3 x 3 矩阵,这就是我尝试过的:

List<List<int>> matrix = new List<List<int>> { 
    new List<int>() { 6,2,3 },new List<int>() { 1,8,2 },new List<int>() { 3,4,7 }
};

public static int diagonalDifference(List<List<int>> arr)
{
   int right = 0;
   int left = 0;
   int result = 0;

   for (int i = 0; i < arr.Count; i++)
   {
       for (int j = 0; j < arr.Count; j++)
       {
           right = arr[0][0] + arr[1][1] + arr[2][2];
           left = arr[2][0] + arr[1][1] + arr[0][2];
       }

       result = Math.Abs(right - left);  
   }

   return result;
}

//Output : 7

那么,如何调整函数以获得与动态矩阵的绝对差异? 感谢指导和帮助!!

解决方法

您可以执行以下类似操作:

    static void Main(string[] args)
    {
        List<List<int>> matrix = new List<List<int>> {
                                        new List<int>(){ 6,2,3,4 },new List<int>(){ 1,8,7 },new List<int>(){ 3,4,7,10},new List<int>(){ 13,24,8},//added one more to demo the code
                                 };

        var diagnoalValues = Enumerable.Range(0,matrix.Count).Select(x => new
        {
            Left = matrix[x][x],Right = matrix[matrix.Count - x - 1][x]
        }).ToList();

        var leftSum = diagnoalValues.Sum(x => x.Left);
        var rightRum = diagnoalValues.Sum(x => x.Right);

        var difference = Math.Abs(leftSum - rightRum);

        Console.WriteLine($"Difference:{difference}");
    }

如果您想减少迭代次数,也可以根据需要将其更改为以下内容:

    static void Main(string[] args)
    {
        List<List<int>> matrix = new List<List<int>> {
            new List<int>(){ 6,};

        var sum = Enumerable.Range(0,matrix.Count)
            .Aggregate(new { Left = 0,Right = 0 },(previous,index) => new
            {
                Left = previous.Left + matrix[index][index],Right = previous.Right + matrix[matrix.Count - index - 1][index]
            });


        var difference = Math.Abs(sum.Left-sum.Right);

        Console.WriteLine($"Difference:{difference}");
    }
,

在没有太多更改代码的情况下,我想出了这个。您不需要嵌入 for 循环来实现这一点。该算法从左到右计算左右对角线,其中右对角线从顶部开始向右下降,左对角线从底部开始向右上升。

    public static int diagonalDifference(List<List<int>> arr)
    {
        var right = 0;
        var left = 0;
        var result = 0;
        var rowCount = arr.Count - 1;
        var listCount = arr[0].Count;

        for (var j = 0; j < listCount; j++)
        {
            right += arr[j][j];
            left += arr[rowCount - j][j];
        }
        result = Math.Abs(right - left);

       return result;
    }

这假设矩阵在列和行中是偶数。每行具有相同数量的元素,并且一行中的元素数量等于矩阵的行数。对于不同的列和行,必须对其进行修改以满足您的需要。

,

动态矩阵的主要挑战是长度与宽度不匹配。在这种情况下,您必须决定如何处理它(缺失的平均值、跳过缺失等)。

要处理相等的矩阵,您只需要矩阵的长度即可。

下面我将展示如何获得对角线长度以及如何使用 for 循环创建左右对角线。这没有考虑长度和宽度不相等的情况,而是会因为对角线长度是两个维度中较小的一个而中断。

var right = 0;
var left = 0;

var length = matrix.Count;
var width = matrix[0].Count;

var diagLength = length == width ? length : Math.Min(length,width);

for (int i = 0; i < diagLength; i++)
{
    right += matrix[i][i];
    left += matrix[diagLength - 1 - i][i];
}

var diff = Math.Abs(right - left);
,

通常,当我们遇到此类问题时,我们可以借助 Linq查询

using System.Linq;

...

private static diagonalDifference(List<List<int>> arr) => Math.Abs(arr
  .Select((line,index) => line[index] - line[line.Count - 1 - index])
  .Sum());

如果您更喜欢旧的 for 循环(请注意,我们只需要 一个 循环):

private static diagonalDifference(List<List<int>> arr) {
  int result = 0;

  for (int i = 0; i < arr.Count; ++i) 
    result += arr[i][i] - arr[i][arr.Count - 1 - i];
 
  return Math.Abs(result); 
}

这是怎么回事?我们逐行扫描矩阵 (arr) line 求和左右对角线项之间的差异:

6,3  -> 6 - 3 == 3 
1,2     8 - 8 == 0
3,7     7 - 3 == 4
            ----------
                     7 in total 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。