[JS] Домашно Arrays - идентични 3 и 4 задача


5
Аз ли нещо не разбирам или решението на тази задача се отличава от това на предната само с един знак?
Или вместо да проверяваме дали arr[i]==arr[i-1] то проверяваме arr[i]>=arr[i-1]?
:)



Отговори



0
Може ли условията на задачите?

от Mahata231 (1351 точки)


0

Трета:

3.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}.
 
Четвърта:
Write a script that finds the maximal increasing sequence in an array. Example:
{3, 2, 3, 4, 2, 2, 4} à {2, 3, 4}.

 


от Vladi5rov (934 точки)


0
В моите решения, разликите са в споменатите от теб проверки и също при извеждането на поредиците, но не съм сигурна, че са ми правилни.
btw: тук също има тема за 4 задача от масиви:
http://forums.academy.telerik.com/20977/js-arrays-%D0%B7%D0%B0%D0%B4-4

от svetlaz (269 точки)

0
Благодаря колежке, странно че на търсачка не открих тема за тази задача...

от Vladi5rov (934 точки)



1
Миналата година в Академията ги имаше тези задачки и аз на пръв поглед си помислих, че разликата е само смяна на знака == с >. Но не. След като се задълбаеш в 4-та задача ще разбереш, че разликата е съществена.
Докато при трета е достатъчно само да намериш най-дългата поредица от един и същ елемент, и след това да го изведеш с един for цикъл толкова пъти, колкото се е повтарял, то в четвърта трябва да засечеш от къде ти започва, или пък къде ти свършва съответната подредица, колко е дълга, и после да изведеш самата подредица

от bakalov85 (604 точки)


0

Здрасти Адаш,

явно си зависи от имплементацията.При мен минавам целия масив и ако съм в поредица засичам началото и дължината.Като свърши проверявам дали е станала по-дълга от най-дългата до сега и ако да - запомням началото и  дължината на новата най-дълга.Така ще намери първата най-дълга , ако има няколко с еднаква дължина.Проверката дали е започнала нова редица в трета задача е arr[i]==arr[i-1] , а в четвърта arr[i]>=arr[i-1]. Т.е. разлика 1 знак.

Не претендирам за елегантност на решението, като бързина също. Макар че, някой може да се подлъже да го направи с O( n*n) и тогава става много бавно при големи масиви.

Ето кода:

    <script type="text/javascript">
         document.write("Task-4-4 <br/>");
        var myArray=[1,2,3,4,5,6,218,6,6,567,677,1000,1100,1110,1111,11,4];  
    // 6,6,,6,65,34,6,8,8,34,8,5,4,3,1,2,34,34,34,5,5,5,6,65,34,34,34,5,5,55,5,5,2,         var myLength=myArray.length;
        var myFlag=false,   // Imalo li e do sega 2 ednakvi
            myCount=1,            // Broia4 na tekushtata redica
            myMaxCount=1,        // Broia4 na MAX redica
            myMaxAdress=0, myAdress=0, i=0;
        for ( i=1 ; i < myLength ; i++ ){    //    Simvola  savpada s prednia
            if ( parseInt(myArray[i]) >= parseInt(myArray[i-1]) ) {
                if ( !myFlag ) {   // Ima li zapo4nata redica?
                    myFlag=true;      // Zapo4vame nova redica
                    myAdress=i-1;
                }
                myCount++;
            }
            else if ( myFlag ) {    //    Simvola ne e > prednia
                myFlag=false;    // redicata svarshi
                if ( myMaxCount < myCount ) {
                    myMaxCount=myCount;
                    myMaxAdress=myAdress;
                }
                myCount=1;
            }
        }
        if (( myFlag ) && ( myMaxCount < myCount )) {    // redicata svarshi nakraia
            myMaxCount=myCount;
            myMaxAdress=myAdress;
        }

        document.write("The first maximal increasing sequence in an array:<br/>");
        document.write(myArray.join(","));
        document.write("<br/> is: <br/>");
        for ( i = myMaxAdress ; i < myMaxAdress + myMaxCount ; i++ ) {
                document.write( myArray[i]," " );
        }
        document.write("<br/> Number of elements= ",myMaxCount);      
    </script>

Е и в текста накрая има разлика , но нея не я броя.

Поздрави!

 


от Vladi5rov (934 точки)


0
Имаш добра идея, но нещо се счупва ако подам поредни числа към края.

от pe6eto (222 точки)

0
Ха! Не очаквах след толкова много време коментар по тази тема! И какво значи "нещо се счупва"? Работи си коректно! Обърни внимание на условието на задачата! Скрипта намира първата нарастваща редица с дължина Х. Ако има друга с такава дължина - просто я игнорира. Май само си се забавлявал да минеш навсякъде да коментираш "нещо си" и не си вникнал надолу?

от Vladi5rov (934 точки)


0

Тая задача ме отказа от живота :@ 

уж става пък после все нещо не работи :(

Не мога да измисля как да сравня редиците! Имам предвид, че когато има само една най-дълга редица от равни числа е ОК, но като има 2 тогава ми ги изписва и двете, пък ако реша да направя така, че да ми се изтрива масива в който ги пазя, то като дойде някое число което не е от редицата, всичко се изтрива :( :@:@:@

http://pastebin.com/FvdmsJ9E

Чакам забележки: (Мисля, че ще има доста :))


от CaptCortez (1242 точки)


0
Мисля, че няма нужда да се зориш ако има 2 или повече такива редици- поне по условие. По-късно ще видя и кода ти

от Vladi5rov (934 точки)

0
Здравей, зная че е трудно да разчиташ чужди програми по принцип. Аз също се затруднявам когато е по-завъртяно. Все пак разгледай кода по-горе. Той е подобен на твоя, като съм добавил еднна булева променлива myFlag. Идеята е, че ако срещнем нова редица отговаряща на условието - тогава я установяваме на true и продължаваме натам. Ако открием още 1 елемент и вече сме установили myFlag=true - то само увеличаваме брояча на текущата редица. Ако обаче свърши текущата редица сваляме myFlag=false и проверяваме дали току що свършилата редица не е станала по-дълга от най-дългата до сега. Поздрави!

от Vladi5rov (934 точки)


1

Понеже задачите за домашно по JavaScript Part1 на курсистите започнали курса на 18.02.2013 съвпадат с тези, ще пусна моето решение тук, за да избегна дублирането на теми.

Demo

Source

Подобна на 3-та задача, но с тази разлика, че проверяваме дали моментният елемент  от масива е по-малък от следващия /за да е в сила правилото за нарастваща редица/. Чрез тернарен оператор проверяваме дали това е в сила и ако е, то увеличаваме с единица стойността на променливата пазеща текущата дължина на нарастващата редица, докато ако не е- присвояваме и стойност единица, което означава че имаме "прекъсване" и редицата вече не е нарастваща. След тази проверка проверяваме дали моментната дължина currentLength е по-голяма от най-добрата открита досега bestLength и ако е така на bestLength и присвояваме стойността на currentLength. В отделна променлива пазим номера на индекса, от който е започнала най-добрата до сега нарастваща редица. След като приключи проверката, въртим for цикъл от 0 до bestLength /явяваща се дължината на редицата която ни трябва/. Печатането на елементите на масива ще е от запаметеният индекс /numIndex/, от който започва най-добрата досега редица, като всеки път нараства с 1-ца, докато не достигне  максималната си дължина пазеща се в променливата bestLength.


от Vlado_XXX (944 точки)


0
Нещо не си направил както трябва, защото не дава очаквания резултат. Виж си кода пак.

от pe6eto (222 точки)

0
Би ли дефинирал какво имаш предвид под "нещо"? :] Да не би да имаш предвид, че редицата която кодът ми открива не е винаги нарастваща с 1-ца ? Ако прочетеш условието ще видиш, че задачата ни е да открием най-дългата нарастваща редица, а не най-дългата нарастваща редица с 1-ца. При Example-то се получава такъв отговор, понеже в този случай това е единствената нарастваща редица в последователността от числа! Вземи предвид, че редицата 1, 3, 7, 9, 12, 17, 25 също е нарастваща ;]

от Vlado_XXX (944 точки)



0
Ето и моето решение, мисля ,че си работи коректно:
function arraySequence() { var input1, array, count, maxCount, safe, i, j; i = 0; j = 0; count = 1; maxCount = 1; safe = 0; input1 = jsConsole.read("#arr1"); array = input1.split(','); for (; j < array.length - 1; j++){ if (array[j] < array[j + 1]) { count++; safe = j+1; maxCount = count; } else { count = 1; } } safe -= maxCount - 1; for (; i < maxCount; i++) { jsConsole.write(array[safe]); jsConsole.write(' '); safe++; } }



1

Ето и моето решение.

Зад 3;

http://jsbin.com/oDOkeme/1/edit?html,console

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>HW 3</title>
</head>
<body>
    <script>
        
        var arr = [0, 0, 1, 3, 3, 3, 1, 2, 2, 6, 6, 6, 6, 6, 6, 1, 3, 3, 3, 1, 4, 4, 4, 4, 5, 5, 5, 5, 5];
        console.log(arr.join());
        var arrMAX = [arr[0]];
        var arrNEXT = [arr[0]];
        var count = 1;

        for (var i = 0; i < arr.length - 1; i++) {
            if (arr[i] == arr[i + 1]) {
                arrNEXT.splice(0, 0, arr[i + 1]);
                count += 1;                
                if (arrMAX.length < count) {
                    arrMAX = arrNEXT;
                }
            } else {
                arrNEXT = [arr[i + 1]];
                count = 1;
            }
        }
        console.log("arrMAX = " + arrMAX.join("|"));        
    </script>
</body>
</html>

Зад 4;

http://jsbin.com/iBoXIvo/1/edit?html,console

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>HW 4</title>
</head>
<body>
    <script>

        var arr = [0, 1, 2, 0, 1, 2, 3, 4, 5, -2, 0, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, , -2,7, 8, 9, 10, 5, 6, 7, 8, 9];
        console.log(arr.join());
        var arrMAX = [arr[0]];
        var arrNEXT = [arr[0]];
        var count = 1;

        for (var i = 0; i < arr.length - 1; i++) {
            if (arr[i] < (arr[i + 1])) {
                arrNEXT.splice(arrNEXT.length, 0, arr[i + 1]);
                count += 1;
                if (arrMAX.length < count) {
                    arrMAX = arrNEXT;
                }
            } else {
                arrNEXT = [arr[i + 1]];
                count = 1;
            }
        }
        console.log("arrMAX = " + arrMAX.join("|"));
    </script>
</body>
</html>
 


от bstaykov (528 точки)


0
Ето една решение на задачите и от мен
3 задача - http://pastebin.com/Hsp1Qrr5
4 задача - http://pastebin.com/PgjQbJ30
Въпреки, че двете задачи на пръв поглед изглеждат доста еднотипни, всъщност има съществена разлика в решението им. В трета задача трябва сравняваш текущия елемент със следващия и да запаметяващ най-дългата поредица в една променлива. В четвърта задача трябва да се помни началото на поредицата ( което се оказа и най-сериозния проблем за имплементиране) и дължината й. Поне според мен алгоритъмът на 4-та е по-интуитивен, докато в 3-та задача дребните детайли на няколко пъти ме объркаха и даваха грешен резултат.



0

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

Поствам решението си и на четвърта задача. Т.к. подходът ми при имплементирането на трета задача беше изцяло да изследвам поредиците като стартова позиция и дължина, тук разликата ми в алгоритъма е съвсем малка и е само в проверката (  if (newArray[i + 1] - newArray[i] === 1) {}... ), в която проверявам текущия и следващия го елемент от масива.

За ваше улеснение ще постна и двете задачи:

задача 3 - http://pastebin.com/NDB2PBY5

задача 4 - http://pastebin.com/4iAtduPk

Всякакви коментари и забележки са добре дошли!

Поздрави!


от kalina_sf (192 точки)