Loading...

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

ljbomir avatar ljbomir -1 Точки

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 54 Точки

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

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 20 Точки

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

1
v.krastev avatar v.krastev 54 Точки

според мен 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 20 Точки

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 54 Точки

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

0
ljbomir avatar ljbomir -1 Точки

Кръстев,

Благодаря за идеята с втория луп. Аз също съм на мнение, че трябва да се опишат всички случаи които не са описани в условието. Ето как изглежда модифицираният вариант--> 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 54 Точки

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

0
ljbomir avatar ljbomir -1 Точки

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

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

 

Любо

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

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


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

 

Любо

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

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

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

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

 

0
v.krastev avatar v.krastev 54 Точки
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 54 Точки

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

0
IvanMitkov avatar IvanMitkov 20 Точки

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

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.