подсчет отрицательных чисел в массиве - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь найти количество отрицательных чисел в двумерном массиве (квадратный матикс).В матрице, если вы идете сверху вниз и налево, чтобы написать число увеличивается.Логика здесь должна начинаться с последнего столбца и идти налево.Если вы найдете отрицательный номер, увеличьте индекс строки и продолжайте в том же духе до последней строки.Я получаю сообщение об ошибке в коде Java, но не в Python.

public class O_n 

{

public static void main(String[] args)

{

    int firstarray[][] = {{-2,-1,0},{-1,0,1},{0,1,2}};
    int secondarray[][] = {{-4,-3,-2},{-3,-2,-1},{-2,-1,0}};
    System.out.print ("First array has"+count_neg(firstarray));
    System.out.println("negative numbers");
    System.out.print ("Second array has"+count_neg(secondarray));
    System.out.println("negative numbers");
}

public static int count_neg(int x[][]){
    int count = 0;
    int i = 0; //rows
    int j = x.length - 1; //columns

    System.out.println("max column index is: "+j);
    while ( i >=0 && j<x.length){
        if (x[i][j] < 0){ // negative number
            count += (j + 1);// since j is an index...so j + 1
            i += 1;
        }
        else { // positive number
            j -= 1;
        }
    }
    return (count);
    }
}

Я получаю этот вывод

max column index is: 2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at O_n.count_neg(O_n.java:22)
    at O_n.main(O_n.java:9)
/home/eos/.cache/netbeans/8.1/executor-snippets/run.xml:53: Java 
returned: 1
BUILD FAILED (total time: 0 seconds)

Что не так с этим кодом?то же самое работало в питоне ...

def count_neg(array):
    count = 0
    i = 0 # row
    j = len(array) -1 # col
    # since we are starting from right side

    while j >= 0 and i < len(array):
        if array[i][j] < 0: 
            count += (j + 1)
            i += 1
        else:
            j -= 1
    return count
print(count_neg([[-4,-3,-1,1],[-2,-2,1,2],[-1,1,2,3],[1,2,4,5]]))

Ответы [ 4 ]

0 голосов
/ 03 июня 2018

Здесь небольшое изменение в алгоритмах для получения правильного результата со столбцами, которые не содержат отрицательных чисел:

    while j >= 0 and i < len(array):
    if array[i][j] < 0:
        count += (j + 1)
        i += 1
    else:
        j -= 1
    if j < 0:
        i += 1
        j = len(array) - 1

Вы можете проверить это с помощью следующего массива [[1,2,4,5],[-2,-2,1,2],[-1,1,2,3],[1,2,4,5]]

0 голосов
/ 03 июня 2018

Ваши индексы возвращаются из версии Python:

while j >= 0 and i < len(array)

В версию Java:

while (i >= 0 && j < x.length)
// Change to
while (j >= 0 && i < x.length)

Вывод:

max column index is: 2
3

Если вы используетеJava8, вы можете использовать потоки для реализации count_neg:

public static int countNeg(int x[][]) {
    long count = Stream.of(x)
            .flatMapToInt(arr -> IntStream.of(arr))
            .filter(i -> i < 0)
            .count();
    return Math.toIntExact(count);
}
0 голосов
/ 03 июня 2018

Прежде всего ваш алгоритм не находит количество отрицательных чисел.

Вот результаты кода Python:

print(count_neg([[1, 1, -1],[1, 1, -1],[1, 1, -1]])) результат - 9

print(count_neg([[1, 1, -1],[1, 1, 1],[1, 1, 1]])) результат - 3

Таким образом, предоставленный код находит сумму индексов столбцов + 1 для некоторых отрицательных чисел, а не для всех.А для ваших тестовых массивов он возвращает псевдо-правильные значения.

Чтобы найти число отрицательных чисел в двумерном массиве, вам просто нужно получить каждое число, проверить, меньше ли оно нуля, и увеличить счетчик.одним, если это правда.Поэтому невозможно получить правильный результат со сложностью лучше, чем O (n 2 ).

Вот правильный код на Java, который делает это:

public static int count_neg(int x[][]){
    int count = 0;
    for(int i = 0; i < x.length; i++){
        for(int j = 0; j < x[i].length; j++){
            if(x[i][j] < 0) count++;
        }
    }

    return count;
}
0 голосов
/ 03 июня 2018

Я бы написал такой метод, просто пройдите через 2d массив и увеличивайте count каждый раз, когда обнаруживается отрицательное число

public static int count_neg(int x[][]){
    int count = 0;

    for(int i = 0; i < x.length; i++){
        for(int j = 0; j < x[i].length; j++){
            if(x[i][j] < 0){
                count++;
            }
        }
    }
    return (count);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...