Найти самую длинную подпоследовательность из положительных чисел

Рейтинг: 1Ответов: 2Опубликовано: 17.05.2023

Ввод должен вводиться обязательно до нуля.
Мой код выводит количество всех положительных чисел а мне нужно только количество последовательности.
Например ввод (1 2 3 4 -2 3 4), вывод (4)

public class Numbers {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);          
        int a = 0;
        System.out.println("Вводите числа до 0");
        int n = 0;          
        a = scan.nextInt();
        while (true) {
            int x = scan.nextInt();
                
            if (x == 0)
                break;
            n += 1;
        }
        int count = 1;
        int count1 = 1;   
        for (int i = 1; i < n; i++) {
            if (a > 0) {
                count++;
            } 
            if (count > count1) {
                count1 = count;
            } 
            else {
                count = 1;
            }
        }
        System.out.println(count);
        scan.close();
    }
}

Ответы

▲ 2Принят

Представленный код не проверяет числа, введённые пользователем; в первом цикле просто подсчитывается количество чисел, не равных 0, а второй цикл проверяет одно и то же число a, введённое один раз.

В целом подобные вопросы встречаются достаточно часто, различия только в условиях, накладываемых на элементы:

Алгоритм во всех случаях простой:

  • заводятся счётчики текущей длины и максимальной длины
  • для каждого значения (введённого пользователем или из массива), удовлетворяющего заданному условию (в данном случае a > 0), инкрементируется счётчик и сразу же проверяется/обновляется максимум; иначе счётчик сбрасывается для a < 0

Вариант реализации:

public static void main(String[] args) {
    Scanner scan = new Scanner(System.in);          

    System.out.println("Вводите числа до 0");
    int count = 0, maxCount = 0, a;

    while ((a = scan.nextInt()) != 0) {
        if (a > 0) {
            if (++count > maxCount) {
                maxCount = count;
            }
        } else {
            count = 0;
        }
    }
    System.out.println("Длина самой длинной подпоследовательности: " + maxCount);
}
▲ 0

Можно примерно так:

int a;
int n = 0;          
int maxlen = 0;
System.out.println("Вводите числа до 0");
while (true){
    a = scan.nextInt();
    if (a == 0)
          break;
    if (a > 0) {
         n += 1;
         maxlen = max(maxlen, n);
    }
    else
         n = 0;    
 }
 System.out.println(maxlen);