JS Fundamentals Arrays Homework


0

Здравейте, отварям тази тема, в коята да обсъждаме домашното за Масиви, тъй като много хора обсъждаха в различни постове и тн. Можете да задавате въпроси за всички задачи тук.  

Аз ще започна с първата задача. Както винаги се забива на най-лесното. Някой може ли да сподели мнение, къде е грешката?

function solve(args) {
   var n = +args[0];
   var arr = [];
   var i;
 
  
    for(i = 0; i < n; i += 1){
    arr[i] = i * 5;
   }
  console.log(arr[i].join('\r\n');
}




Отговори



0

  1. function solve(args) {
  2.       let n = +args[0],
  3.       arr = [],
  4.       i;
  5.  
  6.     for(= 0; i < n; i ++){
  7.     arr[i] = i * 5;
  8.    }
  9.   console.log(arr.join('\r\n'));
  10. }

Ето ти го редактиран кода, така изкарва 100/100. Имаше пропуснати ")", "{}", също ";" на места на които трябва да има "," и т.н. Разгледай го и ще видиш какви са разликите.

    

от PTSbg (185 точки)


1

Много странно принтираш, а и самото задаване на стойност в масива също е странно. В масива добавяш с Push. Аз съм го направил така

function solve(args) { let n = +args[0], arr = [n], multiplier = 5; for (let i = 0; i < n; i += 1){ arr[i] = i * multiplier; console.log(arr[i]); } }


от olebg (598 точки)


0
За принтирането се рових в stackOverflow, как да излезе на нов ред без запетаи. Задаването го правих така, защото при първите домашни БГкодер не приемаше нито let, нито изреждане на нов ред със запетаи. Сега виждам, че решението е доста по-просто, от колкото си мислех. Благодаря за отговора.


0
Това, което май си опитал е да принтираш така масива: 
console.log(sorted.join('\n'));

от olebg (598 точки)



0

Колеги на Binary Search-a го докарах до 90/100, идеи?

function solve(args) { let arr = [...args].map(Number), x = arr.splice(arr.length - 1, 1), n = arr.splice(0, 1), minIndex = 0, maxIndex = arr.length - 1, currentIndex, currentElement; while (minIndex <= maxIndex) { currentIndex = (minIndex + maxIndex) / 2 | 0; currentElement = arr[currentIndex]; if (currentElement < x[0]) { minIndex = currentIndex + 1; } else if (currentElement > x[0]) { maxIndex = currentIndex - 1; } else { return currentIndex; } } return -1; }


от olebg (598 точки)


0
function solve(arr) { var input = arr.map(Number), find, len, i, j, left, right, found; input.splice(0, 1); len = input.length; find = input.splice(len - 1, 1); len -= 1; input.sort(function (a, b) { if (+a < +b) { return -1; } else if (+a > +b) { return 1; } else { return 0; } }); left = 0; right = len - 1; function binarySearch(leftarg, rightarg) { var leftIndex = +leftarg; var rightIndex = +rightarg; var mid = ((rightIndex - leftIndex) / 2 + leftIndex) | 0; if (leftIndex === rightIndex) { found = -1; return; } if (+find === input[mid]) { found = mid; return; } else if (+find < input[mid]) { binarySearch(leftIndex, mid); } else { binarySearch(mid + 1, rightIndex); } } binarySearch(left, right); console.log(found); }

от Bobby15 (65 точки)

0
А някаква идея защо моя код връща 90?

от olebg (598 точки)



0
Здравейте колеги! Някой успял ли е да докара повече от 10% за втората задача? Открих тази тема, в която се потвърждава, че тестовете са сгрешени, но до момента никой не ги е оправил очевидно. Идеи?

от debsbg (5 точки)


0
Все още не е оправена.  Дори да пуснеш празен string пак ще ти даде 10/100.  Предполагам, че няма да я зачитат в крайния резултат, ако не я оправят скоро.


0

на тази задача и заданието е странно. Входните данни не са описани като 2 елемента на масив, а като 2 отделни масива от char елементи:

Input

  • On the first line you will receive the first char array as a string
  • On the second line you will receive the second char array as a string

----------

т.е. входните данни не са ["hello", "helo"], a ['h', 'e', 'l', 'l', 'o'] и ['h', 'e', 'l', 'o'].

Може би от там идва целия проблем. Но аз нямам ни най-малка идея как да взема тези данни въведени на 2 реда.

едит: сега като се замисля, не разбирам какво значи "char array as a string".


от Smytt_kp (115 точки)



0

Колеги за 10-та задачка, докарахте ли я до 100? Аз имам 30/100, всичко друго timeout-ва.

'use strict'; function solve(args) { let number = +args[0], sieve = [], i, j, primes = []; for (i = 2; i <= number; ++i) { if (!sieve[i]) { primes.push(i); for (j = i << 1; j <= number; j += i) { sieve[j] = true; } } } console.log(Math.max(...primes)); } solve(['126']);


от olebg (598 точки)


0

Ако говориш за Prime Numbers, ето код за 100/100

function prime(args) {

    var number = +args[0],
        isPrime;

    for (var i = number; i >= 2; i -= 1) {
        isPrime = true;
        for (var j = 2; j <= Math.sqrt(number); j += 1) {
            if (i % j === 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime === true) {
            return i;
        }
    }
    console.log(-1);



0

То хубаво, ясно е, че дава 100/100, но не изпълнява условието, което е заадено, а именно да се използва въпросният метод.

Иначе да, работи.

Но с метода и аз получавам 30/100, всичко останало тайм аутва. Пробвах 2-3 варианта да завъртя и все се получава 30/100.


от Smytt_kp (115 точки)



0
Здравейте, в задача 3 Maximal Sequence има ли директен код (филтър), които се използва за засичане на най-повтарящите се числа в масива или трябва отново да пуснем един "for", които да мине през всичките и с допълнителни условия да стигнем до най-повтарящите се числа в масива?



0

ами не знам да има такъв филтър!

пък и то задачата е да напишеш точно такъв филтър

прилагам моите решения тук


от mitkop (578 точки)


0

Здравейте, 

Понеже и аз стигам до 90/100 за 07. Binary Search с този код, пробвах кодa на @Bobby15 , който иначе  дава 100/100 в bgcoder, и пуснах следните тестове:

solve(['1', '1', '1']); -> изкарва като резултат -1, а би трябвало да е 0. Имаме такъв граничен случай по условие, масив със само един елемент и тук търсеното число пробвам да е равно на този единствен елемент.

solve(['11', '1', '2', '4', '8', '31', '31', '31', '64', '77', '99', '100', '31']); -> изкарва като резултат 5, а всъщност трябва да е 4, защото търсеното число 31 първо се среща на индекс 4.

EDIT: още един примерен вход:

solve(['10', '32', '32', '32', '32', '32', '32', '32', '32', '32', '32', '32']); -> изкарва отговор 4...

Без изобщо да се заяждам, просто откачам вече с тази задача, аз ли съм супер заблудена, има ли действително проблем с тестовете или просто моето решение не е пълно...някакви идеи по въпроса?


от Daniela_Popova (1125 точки)


1

Мисля, че получаваш 90/100 защото има случай, в който търсеният номер се намира на индекс 0. Когато функция връща числото 0 в BGCoder се принтира празно, т.е. нулата трябва да се връща като стринг, за да се зачете като верен отговор. Аз имах този проблем и (след доста чудене) го реших като в началото на while цикъла, сложих проверка дали числото на нулев индекс не е търсеното число и ако е: return '0'.

Според мен в този код return -1 трябва да бъде извън while цикъла. Идеята е че търсеното число не е в редицата само когато началният индекс стане по-голям от крайният индекс - т.е. когато while цикъла спре. Затова няма нужда и от проверката с || , която връща -1 вътре.

Също, не ти трябва for цикъл който превърта отсечката от редицата. Идеята на Binary Search e, че всеки път проверява дали средното число е това което се търси, ако не е, реже масива на две и пак търси по средата.

По същата причина примерите, в които подаваш последователно еднакви числа връщат индекс, който не е първият на който се намира търсеното число.

Поскъратих кода ти и го тествах в BGCoder и дава 100/100, ето:

function binarySearch(args) { var numbers = args.map(Number), length = numbers.shift(), searchedNum = numbers.pop(), startIndex = 0, endIndex = length - 1, middleIndex; // just in case numbers.sort(function (a, b) { return a - b; }); while (startIndex <= endIndex) { middleIndex = (startIndex + endIndex) / 2 | 0; if (numbers[0] === searchedNum) { return '0'; //BGCoder expects '0' , not number 0 } else if (numbers[middleIndex] < searchedNum) { startIndex = middleIndex + 1; } else if (numbers[middleIndex] > searchedNum) { endIndex = middleIndex - 1; } else if (numbers[middleIndex] === searchedNum) { return middleIndex; } } return -1; }


от nhristova (506 точки)

1

Здравей,

Много ти благодаря за отделеното време :):)

Мхм, тази работа със стринг 0 вместо число 0 си е подвеждащо малко.

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

1 2 5 6 -> търсим числото 8, влизам си в while-цикъла, влизам директно във втория if, където се хваща условието numbers[endIndex] < searchedNum, numbers[3] = 6, което е по-малко от търсеното число 8, връщам -1

и програмата спира.

Другият вариант е тази редица:

5 6 7 8, търсим числото 1, отново влизам в while-а, отново във втория if, но този път се хваща условието

numbers[startIndex] > searchedNum, т.е. numbers[0] = 5, което е по-голямо от търсеното число 1, пак си връщам -1

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

и дълга да е тя, винаги от първия път ще изкарвам -1, докато без тази проверка, влизаш в while-а търсиш среда,

цепиш на две, после пак и така n на брой пъти, докато не извърти цикълът.

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

Цикълът, който ми върти до средния индекс middleIndex при (numbers[middleIndex] === searchedNum) го сложих, за да мога да се справя със случаите, когато имам две еднакви числа и те са в лявата част на масива. Например редицата:

1  2  4  8  31  31  31  64  77  99  100, търсим числото 31. middleIndex = 5, веднага намираме, че numbers[middleIndex] е равен на търсеното число 31 и съответно влизаме в if(numbers[middleIndex] === searchedNum). Ако го нямам този цикъл, а само връщам индекса, тъй като сме намерили търсеното число, то ще ми даде резултат 5, толкова е middleIndex, а всъщност 31 се повтаря преди това - на индекс 4 -> оттук идват грешките.

Кодът, който си сложила дава грешен резултат точно за такива случаи:

solve(['10', '1', '2', '4', '8', '30', '31', '32', '32', '32', '99', '32'])); -> дава като резултат индекс 7, а трябва да е 6, на този индекс първо излиза числото 32;

solve(['11', '1', '2', '4', '8', '31', '31', '31', '64', '77', '99', '100', '31'])); -> резултат 5, а трябва да е 4.

И понеже стана tl;tr, точно това ме притесни, че код, който изкарва 100/100 в bgcoder, дава всъщност грешни резултати, а кодът, с който изкарвам 90/100 пък покрива всички тези по-различни случаи. В тези примери се връща число, различно от 0, така че дали е като стринг или не, тук поне няма значение.

Отново мерси, че се включваш :)


от Daniela_Popova (1125 точки)



0

При мен проблема е на 4та задача - Maximal increasing sequence. Какъвто и input с комбинации да вкарам ми излиза правилния отговор, но в judge-а ми дава 0/100. Само zero теста минава. Някакви идеи?

function solve (args) {
  

    var longestArr = [],
    sum = 1,
    maxVal,
    n = +args.shift();

for (var i = 0; i < n; i++) {
    if(+args[i] == (+args[i+1] - 1)){
        sum += 1;
        longestArr.push(sum); 
    }
    if(!(+args[i] == (+args[i+1]- 1))){
        sum = 1;
    }

   
}
maxVal = Math.max.apply(null, longestArr);

console.log(maxVal);


}


solve(['8', '7', '3', '2', '3', '4', '2', '2', '4']);




-1

 function solve(args){
var array = args.map(Number),
        len = array.length,
        temp = 1,
        result = 1;

        for(var i = 2; i < len; i+=1){
            if(array[i] > array[i-1]){
                temp+=1;
                if(temp > result){
                    result = temp;
                }
            }else{
                temp = 1;
            }
        }

        console.log(result);
 }

ето код за 100 точки 

          


0

Здравей, в кода ти промених и стана за 100/100:

    if(+args[i] < (+args[i+1])){
        sum += 1;
        longestArr.push(sum);
    }else {
        sum = 1;
   }


от TsvetelinaM (52 точки)