我正在研究一个问题(为了好玩),老实说让我迷惑自己。
如果我有这样的矩阵:
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的照片:
可以在CodeFights
上找到此问题答案 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())
以下是对不熟悉的人的一些解释:
==第一层==
Enumerable.Range(0, lists.First().Length)
:枚举所有列索引.Sum(column => ...
:通过求和汇总内(第二)层的结果基本上,我们采用列索引,将索引投影到所需的值,然后总结它们。
==第二层==
当我们处于内层时,暂时抛弃外层的概念。我们将专注于每个专栏。
Enumerable.Range(0, lists.Length)
:与步骤#1相同,但带有行索引.Select(row => lists[row][column])
:将行索引投影到相应索引的值中。.TakeWhile(value => value != 0)
:允许我们跳过0
本身及其后面的每个数字.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]
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];
}
}