[JS] Домашно Arrays - 3 задача


10

Малко забих на тези задачи и нямам никаква идея как да ги реша. Тук стигам да момент, в който мога да кажа, кое число колко пъти последователно се повтаря, но не мога да намеря кое е най-повтарящото се последователно число без да му задавам каквато и да е било стойност. Кода ми изглежда нещо такова. Интересно е че никой не пише за това домашно, само аз ли не мога да ги реша, май fail-вам :D.   

        var a = [2, 1, 1, 2, 3, 3, 2, 1, 3, 3, 3, 3];

        var n = a.length;
    
        for ( var i = 0; i <= n; i++) {
 
            var b = a[i];
            var y = a[i+1];
 
            if ( (b == 3) && (b == y) ) {
 
             console.log(b);
                
            }   
        }
 
EDIT: преименуване на заглавие  по конвенция : http://forums.academy.telerik.com/22184/
 



Отговори



13

Само да допълня условието на задачата:

Write a script that finds the maximal sequence of equal elements in an array. Example: {2, 1, 1, 2, 3, 3, 2, 2, 2, 1}  -->  {2, 2, 2}.

Задачката наистина е много интересна. Мен лично доста ме измъчи, докато я реша :). За решението си използвах подсказката от книгата на Наков:

"Сканирайте масива отляво надясно. Всеки път, когато текущото число е различно от предходното, от него започва нова подредица, а всеки път, когато текущото число съвпада с предходното, то е продължение на текущата подредица. Следователно, ако пазите в две променливи start и len съответно индекса на началото на текущата подредица от еднакви елементи (в началото той е 0) и дължината на текущата подредица (в началото той е 1), можете да намерите всички подредици от еднакви елементи и техните дължини. От тях лесно може да се избере най-дългата и да се запомня в две допълнителни променливи – bestStart и bestLen."


от georgi.s.yankov (6219 точки)


0
Само да те помоля да дадеш условието на задачата. :)

от kirov (4821 точки)


0
write a script that finds the maximal sequence of equal elements in an array :)

от nikych (152 точки)

0
Опа забраивх да го публикувам, ето това е: Write a script that finds the maximal sequence of equal elements in an array. Example: {2, 1, 1, 2, 3, 3, 2, 2, 2, 1} -> {2, 2, 2}.




9

Георги вече е дал подсказката. А иначе...

Този тип задачи не са до "мога" или "не мога". Разпиши си алгоритъм на лист, помисли как ще стане, стъпка по стъпка. Възползвай се от шанса да си драскаш схемички, таблици (както на теб ти е най-удобно) и/или въобще всичко, което ще ти помогне по-лесно да визуализираш всичките стъпки. Работи. След това си го реализираш. Когато нещо не работи, дебъгваш. Има една готина ключова думичка debugger (да живее видеото за цикли, щото го бях забравил това). Слагаш я в кода и следващия път като го пуснеш, поне в Хром, спира на  въпросното място. С F10 можеш да минаваш на следващия ред, а отдясно можеш да следиш текущи стойности. Виждаш кое не е наред и дооправяш написаната логиката.

Така се учи да решава човек. Неможенето идва единствено от липсата на начален верен подход - който е всичко друго но не и начално масирано бомбардиране на клаваитурата. : ) Когато пък някой дори опише/даде решение, докато ти не си минеш през нещото от-до, положителният ефект за теб самия/самата е минимален.

 

от Velidar (1099 точки)


0
Твърдо подкрепям!!!

от georgi.s.yankov (6219 точки)


4

Ето и моето решение - много е кратко:

 

 

(function() {
  var arr = [8, 9, 5, 3, 1, 9, 6, 3, 9, 5, 1, 5, 5, 5, 5];
  
  console.log(Math.max.apply(null, arr.toString().replace(/\,/g, "").match(/(.)\1+/g)));
}());
 
 
Това работи за най-простия случай. За случаите когато числата от масива са многоцифрени и има и отрицателни - трябва малко да се преработи и ще го направя вечерта след работа :) 
 
Като hint - най-често този случай се решава като всеки елемент от масива се използва като индекс на обект. Масива се обхожда веднъж и стойността на обекта със индекс елемент от масива се увеличава с 1 всеки път като се срещне елемента. После се търси най-голямата стойност в обекта. Но това няма да помогне за този конкретен случай
 
Можете да го изтествате ТУК

от ttsvetko (165 точки)


0
Ето и ъпдейт - работи със отрицателни числа, със стрингове както и с масиви, чиито елементи са от различен тип:
http://jsbin.com/uzibuy/1/edit
Който иска разяснение как работи - да пише :)

от ttsvetko (165 точки)

0
Не мисля че се опитват да ни накарат да упражняваме тези команди колега според мен трябва да се направи с For цикъл :) , но въпреки това евала бая си си поиграл с командите :)

от Цвятко Цветков (0 точки)



1
В случай , в който алгоритъма открие например {5,5,5,5}, {3,3,3,3}, както е възможно , дори и още подобни комбинации, какво смятате трябва да се изведе като резултат? Само първата последователност, само последната или всички да са изброени?

от aleahim (0 точки)


0
Много добър въпрос!

от Vladi5rov (934 точки)

0
Въпросът е добър и е хубаво, че се задава, защото някой точно тук би могъл да се подхлъзне :).
Лично аз отговарям на въпроса "maximal sequence of equal elements", като първо извеждам число, което представлява максималната последователност от еднакви елементи, а след това и изброявам възможните срещнати редици.
Например при масив: [2, 1, 1, 3, 3, 11, 11]
Ще ми изведе следния резултат:
Maximal sequence of equal elements: 2 --> 1, 1, --> 3, 3, --> 11, 11,

от georgi.s.yankov (6219 точки)



3

Здравейте колеги,

Ще ви издам една тайна... Това е първата задача от всички за JavaScript, над която съм мислил най-много :). Не знам защо, но много ме измъчи.

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

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

Version 1.2 -  http://jsfiddle.net/georgi_yankov/x5nhv/
Version 1.3 - http://jsfiddle.net/georgi_yankov/rgPdd/

EDIT 1:
Ами не, все още има нужда от доработка, залавям се.

EDIT 2:
Обнових си решението. Сега вече работи, като искам да обърна внимание, че не съм си играл да ми извежда съобщение, ако няма повтарящи се елементи или ако масивът е празен. Цялата си сила я вложих в доста по-важен бъг :).

EDIT 3:
В последната си версия (Version 1.3) само добавих съобщения в случай на празен масив или когато няма повтарящи се елементи.


от georgi.s.yankov (6219 точки)


0
колега тествах, при добавяне на още една 9-тка в края се появи и още една 11-ска в резултата :)

от Viktor_Ivanov (2505 точки)

0
Не извежда коректно, когато имаме най-дълга редица за последна и предпоследна.

от Velidar (1099 точки)



1

Колеги ето го и моето недодялано решение

http://jsfiddle.net/siropo/KRzxB/1/

И аз имам нещо затруднения с извеждането на повече повтарящи се поредни.

Засега бачка нормално само да изведе колко еднакви поредни има :(


от Viktor_Ivanov (2505 точки)


0
Когато най-дългата редица е в началото, показва с 1 по-малко, отколкото трябва. Май други проблеми няма.

от Velidar (1099 точки)

0
как така? Ако имаш в предвид това
1,1,1,1,1,2,2,3,3,3
туко що го тествах и ми върна
number 1 repeats 5 times/
Или може би нещо друго имаш в предвид

от Viktor_Ivanov (2505 точки)



0

Ако на някой му е интересно как подхождам, още едно решение тук.

Относно това, какво точно трябва да се изведе. Щом не е изрично казано, няма абсолютно никакво значение. По усмотрение. В случая, извеждам първата най-дълга. Ако ли пък искам да ми се извежда повече от една редица, проверката при започването на нова редица ще включва и if (bestSeqLen == seqLen), при което ще добавям в масив дължина и начало, като поредни елементи, на целевите редиците. При намирането на нова най-добра редица, масивът ще се занулява.  С този масив, останалото е лесно. Така бих го направил аз.


от Velidar (1099 точки)


0
Ето още едно решение:
http://jsbin.com/eyebud/11/edit Edit: тук може би ще се види: http://jsfiddle.net/svetla/KX6JZ/

от svetlaz (269 точки)


3

Разбирам, че това са само драфтове, но не е зле да пишете малко по конвенционални имена на променливи ;)

например това bestLen (на българси най-добра дължина) защо да не е maxSequenceLen, или bestStart(на българси най-добър старт) ...нямат нищо общо с контекста. Имената на променливи се взимат директно от условитето на задачата "1.Write a script that finds the maximal sequence of equal elements in an array..."

С най-добри чувства го казвам, просто се учудих като го видях от перфекционист като Жорката или от Виктор (от когото научих доста за WP и PHP) :)


от venelinpetrov (1221 точки)


2

И така след изгърчване над тази задача, тоест да вади всички повтаящи се числа или стрингове ето версия 2

http://jsfiddle.net/siropo/xMS6E/

не знам поизкриви ме не знам защо. Но се изкефих накарая най-после егати цикала видях.

Едит: версия 2.1

http://jsfiddle.net/siropo/xMS6E/1/


от Viktor_Ivanov (2505 точки)


0
Я пробвай с тези числа: 1, 2, 3, 2

от georgi.s.yankov (6219 точки)

0
в смисъл? Пробвай без интервалите. Както Велидар написа по рано много ми е претенциозен инпута за масива. Просто не съм си играл да го направя по удобно. Въвеждай ги без интервал.
едит: или имаш в предвид да го направя ако няма повтарящи се да връща, че няма повтарящи. Това ли имаш в предвид?

от Viktor_Ivanov (2505 точки)