Suren97 Ответов: 2

Javascript: матрица, как получить сумму тех чисел, которые не равны 0


У меня есть функция F(x), которая получает матрицу`
Ф([
[0,1,5,2],
[1,0,2,0],
[0,0,3,4]
]);
Мне нужно сделать 0 тех чисел, которые выше числа также 0. В результате я должен получить вот это`
[
[0,1,5,2],
[0,0,2,0],
[0,0,3,0]
];
Тогда мне нужно подсчитать сумму тех чисел, которые не равны 0. В результате я должен получить вот это`
13(1+5+2+2+3=13).

Что я уже пробовал:

Я пробовал так, но он возвращает 11.

function F(x){
	var sum = 0;
	for(var i = 0; i < x.length; i++){
		for(var j = i; j < x.length; j++){
			if(x[i][j] == 0){
				x[i+1][j] = 0;
			}
			if(x[i][j] != 0){
				sum += x[i][j];
			}
		}
	}
	return sum;
}
console.log(F([[0,1,5,2],[1,0,2,0],[0,0,3,4]]));

2 Ответов

Рейтинг:
8

lw@zi

Здесь мало проблем. Один из них-это начальный индекс для j. Он должен быть равен 0. Во-вторых, код в самом цикле. Для каждого элемента вы должны проверять элемент над ним, а не тот, что ниже. Как только я = длина, i + 1 это приведет к ошибке. Кроме того, предельное значение во втором цикле for может совпадать или не совпадать с первым. У вас в основном есть массив массивов. Немного более общие решения могут быть примерно такими:

function F(x){
	var sum = 0;
	for(var i = 0; i < x.length; i++){
		for(var j = 0; j < x[i].length; j++){
			// Check for previous element
                        if(i>0){
                            if(x[i-1][j] > 0){
                            sum += x[i][j];
                            }
                        }
            else{
            sum += x[i][j];
            }
		}
	}
	
    return sum;
   
}


Это все еще предполагает, что все подмассивы имеют одинаковое количество элементов. Если в них тоже есть различия, вам нужно будет проверить длину предыдущего массива.


Suren97

Братан, это тоже неправильно, он возвращает 7 вместо 13

lw@zi

Я тебе не братан. Или дорогой. Или сэр. Или еще что-нибудь. Обновлен ответ с отсутствующим блоком else.

Suren97

Большое спасибо :)

Рейтинг:
1

Richard MacCutchan

for(var j = i; j < x.length; j++){

Значение для j должно быть от 0 до 3 (4 столбца), но ваш код имеет его от i (который может быть 0, 1 или 2) до 2. Таким образом, вы будете игнорировать некоторые столбцы в матрице.


Suren97

таким образом, это дает ошибку` Не удается установить свойство '0' из undefined

Richard MacCutchan

В каком смысле?

Suren97

для(var j = 0; j < 4; j++)

Richard MacCutchan

Если i имеет значение 2, то оно находится в последней строке, поэтому i+1-это неопределенная ссылка.

Suren97

так что же мне написать, братан?

Richard MacCutchan

Проверьте, находитесь ли вы на последней строке. Попробуйте подумать о логике вашей программы, прежде чем приступать к кодированию, чтобы точно знать, какие шаги следует предпринять и в каком порядке.