矩阵元素总和C#

时间:2018-02-15 20:31:05

标签: c# arrays

我正在研究一个问题(为了好玩),老实说让我迷惑自己。

如果我有这样的矩阵:

matrix = [[0, 1, 1, 2], 
          [0, 5, 0, 0],
          [2, 0, 3, 3]]

我想找到 0的所有数字的总和,并且0不高于它。这是一个相同的矩阵,分为我想要加的数字:

matrix = [[x, 1, 1, 2], 
          [x, 5, x, x],
          [x, x, x, x]]

matrixSum = 9  // (1 + 1 + 2 + 5)

我首先根据列遍历数组,然后检索我要查找的值,但我不知道如何忽略0位于其上方的值。

public class Program
{
    public static void Main()
    {
        int[] list1 = new int[4] { 0, 1, 1, 2};
        int[] list2 = new int[4] { 0, 5, 0, 0};
        int[] list3 = new int[4] { 2, 0, 3, 3 };
        int[][] lists = new int[][]{list1, list2, list3};

        var result = TestMethod(lists);
    }

    public static int TestMethod(int[][] matrix)
    {
        var lstOfIntsToAdd = new List<int>();
        for(int i = 0; i < 4; i++){
            for(int j = 0; j < 3; j++){
                Console.Write("matrix[[{1}][{0}]] = {2} /", j, i, matrix[j][i]);
            }
            Console.WriteLine();
        }

        return return lstOfIntsToAdd.Sum();

    }
}

这是.NET Fiddle

感谢任何帮助。

来自codefights的照片:

enter image description here

可以在CodeFights

上找到此问题

6 个答案:

答案 0 :(得分:3)

使用LINQ:

var result = Enumerable.Range(0, lists.First().Length)
    .Sum(column =>  Enumerable.Range(0, lists.Length)
        .Select(row => lists[row][column])
        .TakeWhile(value => value != 0)
        .Sum())

以下是对不熟悉的人的一些解释:

==第一层==

  1. Enumerable.Range(0, lists.First().Length):枚举所有列索引
  2. .Sum(column => ...:通过求和汇总内(第二)层的结果
  3.   

    基本上,我们采用列索引,将索引投影到所需的值,然后总结它们。

    ==第二层==

      

    当我们处于内层时,暂时抛弃外层的概念。我们将专注于每个专栏。

    1. Enumerable.Range(0, lists.Length):与步骤#1相同,但带有行索引
    2. .Select(row => lists[row][column]):将行索引投影到相应索引的值中。
    3. .TakeWhile(value => value != 0):允许我们跳过0本身及其后面的每个数字
    4. .Sum():添加所有内容

答案 1 :(得分:1)

您可以检查上面的行是否存在:

public static int TestMethod(int[][] matrix)
{
    int sum = 0;
    for( int column = 0; column < 4; column++ )
    {
        for( int row = 0; row < 3; row++ )
        {
            if ( row == 0 || matrix[ row - 1 ][ column ] != 0 )
            {
                sum += matrix[ row ][ column ];
            }
        }
    }       
    return sum;         
}

因为C#使用了short-circuit evaulation个逻辑表达式,所以我们可以检查我们是否在第一行,如果我们在第一行,那么if语句的主体将被评估,而不会尝试访问非 - 矩阵的[{1}}行。

更新

如果你应该丢弃所有超过零的值,你可以通过每一栏并添加数字,只要你不会遇到零。

-1

答案 2 :(得分:1)

我将如何做到这一点:
对于第一行,您将所有值相加。 对于任何其他行,检查前一行中的数组是否太短(意味着当前数字之上不能有0)或者前一行中的当前索引是否不包含0。 请注意,条件的顺序至关重要 - 如果更改它,将导致IndexOutOfRange异常。

你可以添加一个检查,如果当前值不是零,但是总和加零是无操作的,所以为什么要这么麻烦?

public static int TestMethod(int[][] Jagged)
{
    var sum = 0;
    for(int i = 0; i < Jagged.Length; i++){
        for(int j = 0; j < Jagged[i].Length; j++){
            if(i == 0 || Jagged[i-1].Length > j || Jagged[i-1][j] != 0) 
            {
                // you could add if Jagged[i][j] != 0 but it's a sum so who cares? 
                sum += Jagged[i][j];
            }
        }
    }
    return sum;
}

答案 3 :(得分:0)

这种做法怎么样?

(伪代码)

  • sum设为0
  • 制作长度等于矩阵宽度(列数)的数组mask,用1填充
  • 每行i
    • 对于行j中的每列i
      • 如果matrix[i,j]为零,请将mask[j]设置为0。
      • sum += matrix[i,j]*mask[j]
  • return sum

以下是代码:

public class Program
{
    public static void Main()
    {
        int[] list1 = new int[4] { 0, 1, 1, 2};
        int[] list2 = new int[4] { 0, 5, 0, 0};
        int[] list3 = new int[4] { 2, 0, 3, 3 };
        int[][] lists = new int[][]{list1, list2, list3};

        var result = TestMethod(lists);
        Console.WriteLine(result);
    }

    public static int TestMethod(int[][] matrix)
    {
        int sum = 0;
        // fill the mask with ones
        int[] mask = Enumerable.Repeat(1, 4).ToArray();
        for(int i = 0; i < 3; i++){
            for(int j = 0; j < 4; j++){
                if (matrix[i][j] == 0) {
                    mask[j] = 0;
                }
                sum += matrix[i][j] * mask[j];
            }
        }
        return sum;

    }
}

输出:

  

9

您可能希望使列数和行数可配置。

答案 4 :(得分:0)

我建议使用2D数组而不是锯齿状数组,以避免索引更高维度的不确定性:

private static void Main()
{
    var myList = new List<string> {"dog", "cat", "dog", "bird"};
    var duplicates = myList.Where(item => myList.Count(i => i == item) > 1).ToList();

    for (var i = myList.Count - 1; i >= 0; i--)
    {
        var numDupes = duplicates.Count(item => item == myList[i]);
        if (numDupes <= 0) continue;
        duplicates.Remove(myList[i]);
        myList[i] += $" ({numDupes})";
    }

    Console.WriteLine(string.Join(", ", myList));

    Console.Write("\nDone!\nPress any key to exit...");
    Console.ReadKey();
}

答案 5 :(得分:0)

帮助您摆弄小提琴(在Console.Write("matrix[[{1}][{0}]] = {2} /", j, i, matrix[j][i]);)之后添加这些:

int ttl =0;                 
if (j==0){
       ttl += matrix[j][i];
         }
if (j>0){
   if (matrix[j-1][i] != 0){
        ttl += matrix[j][i];
                    }
}