0

У меня был заданный вопрос в моем курсе CS в этом семестре, который является вопросом обзора из последнего семестра, но вопрос в следующем: «Учитывая оборванный массив, найдите, если какая-либо строка внутри массив имеет произведение из 48 и, если это так, вернет номер строки. Если ни одна строка не содержит произведение из 48, верните -1. ​​" Это то, что у меня есть до сих пор.Продукт строки в Ragged (зазубренный) массив

public class RaggedProducts { 

public static void main(String[] args) { 
    int[][] a = {{3, 9}, 
       {100}, 
       {1, 4, 6, 2}, 
       {23, 3, 8}}; 
    System.out.println(product(a)); 
} 

/* 
* finds if parameter array has a row which the numbers within that row 
* have a product of 48, returns row integer value. If no rows have a 
* product of 48, returns -1. 
*/ 
public static int product(int[][] ragged) { 
    int product = 1; 

    for (int i = 0; i < ragged.length; i++) { 
     // EDIT: I got my answer, I had to add "product = 1" here 
     for (int j = 0; j < ragged[i].length; j++) { 
      product *= ragged[i][j]; 
      if (i > 0) { // what to do here to reset product value whenever "i" changes 
         // "i > 0" is just a placeholder, I know it doesn't make sense 
       product = 1; 
      } 
      if (product == 48) { 
       return i; // I want to return the value 2 
      } 
     } 
    } 
    return -1; 
} 

}

Если установить первую строку в массиве зубчатым иметь продукт 48, то программа работает, но я запутался о том, как идти о сбросе поля продукта на 1 после строка изменяется. Любая помощь будет оценена!

+0

переменную 'i' изменения на каждом цикле. Для сброса 'product' вам не нужно заботиться о значении' i', вы можете просто сбросить его в каждом цикле внешнего цикла for. – Ralf

ответ

1

Вы, кажется, путаетесь, как работает итерация над 2D-массивом. Ваши две петель в основном это сделать:

for each row i do { 
    //you can do something here too! 
    for each cell j in row i do { 
     ... 
    } 
    //...and here! 
} 

Так что если вы хотите сбросить продукт, когда вы начинаете итерацию следующей строки, просто сделайте это перед вторым циклом в коде.

Кроме того, теперь ваша программа возвращает строку, если произведение равно или больше, чем 48. Из того, что я понимаю, это не то, что вы хотите. Поэтому вы должны проверить равенство после, итерации по ячейкам в строке (после второго цикла, но внутри первого цикла цикла).

Btw, java поддерживает синтаксис, более похожий на мой псевдокод. Вы можете написать

for (int[] row : ragged) { 
    for (int value : row) { 
     //do something 
    } 
} 
+0

Спасибо, это было очень простое исправление, и я получил свой ответ! – derpt34

0
public static int product(int[][] ragged) { 
    int product = 1; 

    for (int i = 0; i < ragged.length; i++) { 
     for (int j = 0; j < ragged[i].length; j++) { 
     product *= ragged[i][j]; 


     } 
     if (product == 48) { 
     return i; // I want to return the value 2 
     }else{ 
     product=1; 
     } 
    } 
    return -1; 
    }