Mam matrycę:

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

Muszę obliczyć sumę wszystkich elementów tablicy, które nie są poniżej 0, więc w tej przykładowej sumie powinna być = 9

Mam taką funkcję:

function matrixElementsSum(matrix) {
  // Write your code here
 var Summa =0
  for (i = 0; i<4; i++){
      var sum =0;
    // console.log(matrix[i].length); //4
    for(j=0; j<matrix.length; j++){
      console.log("Matrix JI "+ matrix[j][i])
         sum = sum +matrix[j][i]; 
         if (matrix[j][i-1]!=0){
           console.log(matrix[j][i-1])
           Summa =Summa+ sum;
         }
    }
    console.log('-----------' +Summa)
    console.log("Sum "+sum);
  }

  return Summa;
}

Myślę, że muszę zmienić if (matrix[j-1][i]!=0), ale to nie działa

1
Elena 23 czerwiec 2017, 21:28

4 odpowiedzi

Najlepsza odpowiedź

Możesz użyć reduce() i wewnątrz forEach() pętla. Jeśli bieżący element w pętli foreach jest zero, możesz przechowywać indeks tego elementu w jednym obiekcie zero i możesz użyć tego obiektu, aby sprawdzić, czy było zero z samym indeksem.

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

var zero = {}
var sum = matrix.reduce(function(r, e, i) {
  e.forEach(function(n, j) {
    if (n == 0) zero[j] = true;
    if (!zero[j]) r += n;
  })
  return r;
}, 0)

console.log(sum)
2
Nenad Vracar 23 czerwiec 2017, 18:41

Powinien być w stanie go uprościć i użyć tego:

function matrixElementsSum(matrix) {
    var Summa =0
    for (i = 0; i < matrix.length; i++)
      for(j = 0; j < matrix[i].length; j++)
         if (matrix[i-1][j] != 0)
           Summa = Summa + matrix[i][j];

    return Summa;
}

Musisz uzyskać dostęp do pierwszej tablicy powyżej bieżącego, stąd matrix[i-1], a następnie tej samej kolumny, stąd [j] w (matrix[i-1])[j] ~ matrix[i-1][j]

0
Easton Bornemeier 23 czerwiec 2017, 18:35

Możesz użyć Array#reduceRight do budowy kolejnej tablicy z cenionymi sumami kolumnami, a następnie użyj {x1}} dla jednego numeru.

var matrix = [[0, 1, 1, 2], [0, 5, 0, 0], [2, 0, 3, 3]],
    result = matrix.reduceRight(function (a, b) {
        return b.map(function (c, i) {
            return c && c + a[i];
        });
    }).reduce(function (a, b) {
        return a + b;
    });

console.log(result);
1
Nina Scholz 23 czerwiec 2017, 18:48

Możesz sumować 2 tablicy i ignorować numery z dolnej tablicy, które elementy z tego samego indeksu w górnej tablicy są 0.

Teraz możesz iterować matrycę z końca i sumować wynikową tablicę.

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

const sumNotUnderZero = (bottom, top) => 
  top.map((v, i) => v ? v + bottom[i] : v);

const result = matrix.reduceRight(sumNotUnderZero)
  .reduce((s, n) => s + n);

console.log(result);
1
Ori Drori 23 czerwiec 2017, 18:46