Longest sequence of equal elements in an integer array

Longest sequence of equal elements in an integer array

ljbomir avatar ljbomir 0 Точки

Longest sequence of equal elements in an integer array

Здравейте,

Успях горе долу да ивзлека най-дългата повтаряща се редица от елементи. Кодът по-долу работи, освен ако повтарящата се редица не е в началото: http://pastebin.com/jvByEzCT

Някакви идеи защо не мога да преброя точно първите числа ?

Благодаря,

Любо

 

 

0
C++ Programming 14/03/2017 22:40:15
v.krastev avatar v.krastev 58 Точки

На въпроса ти - проблема е в

for (int i=1; i<N; i++){
      if (s[i] == s[i+1]){
      counter++;
         if (counter>longest){
            longest=counter;
            repeatNumber = s[i];
            //cout<<repeatNumber<<" end ";
            }
           }
         }

започни цикъла от i = 0, защото i е индексът на елемента от масива, а първият елемент е с индекс 0, не с едно. Това ще ти го направи да работи ако поредицата ти от еднкави интове започва от първата позиция в масива.

НО, кодът ти няма да работи при масив 1 4 12 3 6 7 9 3 5. Тук трябва да изкараш: 3 3, но ти няма да изкараш нищо, защото втората тройка не е следващия елемент след първата тройка. първата тройка ти е i, но втората не е i+1(както ти е в if-a), а е i+n. Като нататък може да има и други тройки. Не знам, аз така тълкува условието - повтарящи се елементи като цяло, а не един след друг. За да го направиш, направи втори for цикъл в първи, за всяко i, го сравнявай с всички останали елементи до края на масива, не само със следващия. Другото нещо, при масив 1 9 4 6 5 6 7 9 8, кое ще изкараш - двете деветки или двете шестици? :D Това го правиш просто с още един брояч и променлива която помни стойността на другото повтарящо се число.

Това е моето тълкувание на условието, ако има нещо пиши.

0
IvanMitkov avatar IvanMitkov 18 Точки

sequence of equal предполага че числата са поредни и еднакви. Ако ще трябва да се намира просто кое число се среща най-често това е вече съвсем различна задача.

0
v.krastev avatar v.krastev 58 Точки

според мен 1 3 2 2 2 5 4 е частен случай на 1 2 3 2 5 2 4, защо да е друга задача?  Ако масива ми е: 5 - тоест един елемент, трябва да си изкара че най дългата редица е: 5. Но, ако масива ми е: 5 7 да речем, тук не виждам никакъв sequence of equal. 5 7 5 или 5 5 7 или 7 5 5, все тая, ми изкарва: 5 5.

За долния коментар, той започва да сравнава елемента с индекс i == 1, с елемента след него - i + 1, след това взима елемент i + 1 и го сравнява с елемент (i + 1) + 1 и т.н. Ако имаш друго предвид, поясни?

0
IvanMitkov avatar IvanMitkov 18 Точки

sequence of equal  означава поредица от еднакви, ако имаш 5 5 5 7 7 1 1 7 7 трябва да ти изкара 5 5 5  а не 7 7 7 7

като достигне до i+1 а i е на края на масива ще излезе извън масива, което никога не е добро нещо. Макар че като нищо може да дава верни резултати, защото боклука който се намира в клетка i+1 може да не влияе. Но може и да прецака нещо.

0
14/03/2017 21:48:42
v.krastev avatar v.krastev 58 Точки

Добре, може и да си прав, реално тълкувах условието без да съм сигурен какво трябва. За другия проблем, просто ще си направи цикъла да върви до предпоследния елемент - до i<N-1. За тълкуването на условието, не искам да споря, може и да си прав, не знам.

0
ljbomir avatar ljbomir 0 Точки

Кръстев,

Благодаря за идеята с втория луп. Аз също съм на мнение, че трябва да се опишат всички случаи които не са описани в условието. Ето как изглежда модифицираният вариант--> http://pastebin.com/PgQSGSck

В някои случаи броя добре, но в други програмата се държи нелогино. Прикачвам снимка.

Специално тази част:

if(s[i]==s[j])

Пробвах различни начини като например s[i]==s[j+i] или s[i]=s[N-j] и разни други подобни, но s[i]==s[j] като че ли изглежда да е най-точно.

 

Поздрави

Любо

0
v.krastev avatar v.krastev 58 Точки

Дай вторият цикъл да започва от j=1, тоест от втория елемент от масива. така сравняваш дали масив[0]==масив[0], ако j=1, ще сравняваш нулев с първи елемент. пробвай така да видиш как ще върви?

0
ljbomir avatar ljbomir 0 Точки

Дам, това го бях пробвал, сега го направих пак да си спомня какво точно не работеше.

Гледам, че отново се държи нелогично. Снимка:

 

Любо

0
16/03/2017 19:09:48
ljbomir avatar ljbomir 0 Точки

НО, според този тест :


Излиза, че  правилно хващам 3-ката с repNum, вместо с repeatNum. longest е 2, което значи че от 0 ще бъдат  3 преброявания на тройката, вместо 4 = Първоначалния проблем който имах.  Това мога да го коригирам с i<=longest накрая. Но ми се струва, че пак няма да работи за всички случаи.

 

Любо

0
16/03/2017 19:21:47
IvanMitkov avatar IvanMitkov 18 Точки

Имаш една редица от числа числа.

Сравняваш първото число i с второто j, ако са еднакви добавяш едно на най-дългата редица. i  става с едно отгоре и j става с едно отгоре, отново сравняваш. С тези два цикъла не разбирам какво точно се опитваш да правиш - всичко се случва само с еднно преминаване. Продължаваш да инкрементираш i и j до като j не е различно от i.

Повтаряш това до като не свършиш масива. Проверката започва с i равно на първото число на масива и свършва до i = предпоследното число в масива и j започва от второто число на масива и свършва при j = последното число от масива.

 

0
v.krastev avatar v.krastev 58 Точки
void printLongestSequenceOfEqualElements(int arr1[], const int& arr1Size)
{
    int number = arr1[0], br = 1, longestSequence = 1;
    for(int i = 0; i<arr1Size; i++)
    {
        for(int j = i + 1; j<arr1Size; j++)
        {
            if(arr1[i] == arr1[j])
            {
                br++;
            }
        }
        if(br>longestSequence)
        {
            longestSequence = br;
            number = arr1[i];
        }
        br = 1;
    }
    for(int i = 0; i<longestSequence; i++)
    {
        cout<<number<<" ";
    }
}

ако в масива няма две или повече редици с еднакъв брой повтарящи се числа, ще си работи, ако има, изкарва редицата, чието число е засякло първо. разгледай и нагоди към твоя код. аз в крайна сметка се съгласих с колегата и го направих по по-простия начин, само ако числата са точно едно след друго, но тази функцийка би трябвало да ти свърши работа.

0
v.krastev avatar v.krastev 58 Точки

той търси най-много повтарящи се числа, без значение дали са пряко едно след друго - това което обсъждахме в началото. а това няма как да стане с един цикъл (поне с моите знания).

0
IvanMitkov avatar IvanMitkov 18 Точки

А ясно, тогава вложения цикъл придобива смисъл.

0