Проблем със задача Longest Sequence of Equal

Здравейте,
Имам следния проблем.
Опитвам се да реша следната задача със Java.

Стигам до това решение.

Проблема ми е при втория loop.
Ще съм благодарен, някой да ми посочи къде ми куца логиката.
Поздрави!

1 Like

Здравей,
добави фигурните скоби за тялото на else, добави кръглата скоба в края на println конструкцията, инициализирай си maxSequence със стойност 1 и в тялото на else също да става 1, защото трябва да броиш и текущия елемент, и последно при извеждането на резултата не използвай последния елемент, а първия, т.е. с индекс 0, тъй като ги сортираш в низходящ ред. Успех!

Здравей, Ивайло,
Благодаря за насоките и за бързата реакция. Поправих кода по начина по който ми посочи и започна да работи в IntelliJ за конкретни примери. При зададени само еднакви числа ми дава грешката “IndexOutOfBoundsException” , а при примерния input на задачата не съвпада отгавора.


Това подходящ метод ли е за решаването на тази задача, или да опитам да измисля друго решение?
Ако е подходящ какво му липсва за да заработи?

Здравей отново,
“IndexOutOfBoundsException” излиза защото, когато всички числа са еднави, изпълнението никога не влиза в else конструкцията и така размера на result е нула и програмата се чупи в последния ред при извеждането на резултата.
Разгледах малко по-внимателно задачата и мога да ти предложа доста по-простичък вариант. Не са нужни два цикъла, нито списък в който да записваш броя на последователните еднакви елементи, които да сортираш.
Предлагам ти просто да направиш един цикъл в който да сравняваш съседни елементи. Ако са еднакви, увеличаваш maxSequence и с continue преминаваш към следващата итерация. Ако обаче не са еднакви, проверяваш дали maxSequence е по-голямо от досегашния “рекорд” записан в result и ако е така, result приема стойността на maxSequence, а maxSequence започва да брои отново от 1. И тъй като отново може всички елементи да са еднакви и никога да не влезем във втория if, съответно result няма приеме стоиността на maxSequence, решаваме да изведем в println по-голямото от двете. Мисля че сега всичко е точно, но ако не е пиши пак.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int elements = scanner.nextInt();
        int[] arr = new int[elements];
        int maxSequence = 1;
        int result = 0;

        for (int i = 0; i < elements; i++) {
            arr[i] = scanner.nextInt();
        }

        for (int i = 0; i < arr.length - 1; i++) {

            if (arr[i] == arr[i + 1]) {
                maxSequence++;
                continue;
            }
            if (maxSequence > result) {
                result = maxSequence;
                maxSequence = 1;
            }
        }
        System.out.println(Math.max(result, maxSequence));
    }
}

Привет.
И това решение дава само частичен отговор. В примера който е зададен в
условието(2 1 1 2 3 3 2 2 2 1) програмата връща отговор 4, а примерно при input(2 2 1 1 2 2 1 1 2 2)
връща 3, за което нямам обяснение. Забелязах че и моето решение не връща правилни отговори на примерите, моля някой ако може да разясни защо се чупят кодовете да разясни.

Подведох те, извинявай. Логиката ми е грешна и благодаря че писа. Значи трябва при всички случаи или да увеличаваме maxSequence ако елементите са еднакви, или да го зануляваме ако са различни. Това ще направим чрез if-else. Присвояването на текущия резултат трябва да стане преди зануляването и при условие, че maxSequence е повече от досега записания резултат.

        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i] == arr[i + 1]) {
                maxSequence++;
            } else {
                if (maxSequence > result) {
                    result = maxSequence;
                }
                maxSequence = 1;
            }
        }
1 Like

Привет, Ивайло,
Благодаря че писа. По този начин програмата минава в Judje и на мен лично ми беше много ползна, понеже изпитвах трудности с изграждането на правилна else-if конструкция. Остава обаче още един проблем, който Judje не проверява и това е ако няма повтарящи се числа в масива.
Помъчих се малко и стигнах до следното решение на проблема

    for (int i = 0; i < arr.length - 1; i++) {
        if (arr[i] == arr[i + 1]) {
            maxSequence++;
        } else {
            if (maxSequence > result) {
                result = maxSequence;
            }
            maxSequence = 1;
        }
    }
    if (result == 1 && maxSequence == 1){
        System.out.println("0");
    }else {

        System.out.println(Math.max(result, maxSequence));
    }

Мерси отново за помоща, надявам се темата да е била полезна.
Поздрави,
Иван.

1 Like