Това https://jsfiddle.net/krLmhbju/ ми дава само 80 т. .
Здравей,
проблема тук е във for цикъла. В програмирането индексите започват от 0 не от 1. От коя стойност да започне цикъла решаваш ти, зависи от задачата (алгоритъм за намиране на prime числа, примерно, започва от 2 защото първото prime число е 2, освен ако няма други указания). В този случай, ако началната стойност на i е 1, добявяш едно число по-малко и за това гърми кода. Останалите кейсове минават, понеже най-голямото число на входа не е на последната позиция.
Зададох 1, защото исках да прескоча първият инпут, който е броя на реалните инпути.
Промених го на 0 и сега ми даде 100 т. . Интересното е, че във Visual Studio оутпута ми е NaN(когато е 0, когато е 1 ми дава най-голямото от останалите инпути).
Не се опитвай да разбереш сега как работи този ред:
let gets = this.gets || ((arr, index) => () => arr[index++])(input, 0);
Просто го приеми така, че +gets()
не просто взема, а изкарва първият елемент от масива.
Ако имаш масив [1, 2, 3, 4, 5], операцията +gets() ще вземе първият елемент и в масива ще останат [2, 3, 4, 5].
Затова и няма смисъл да вземаш числата и да ги записваш в нов масив. Това ти е супер излишна операция. numbersArray.push(+gets());
Можеш директно да вземеш първото число с +gets() и след това във for цикъл да вземаш всяко следващо отново с +gets()
.
Нещо такова:
let n = +gets();
for (let i = 0; i < n; i++) {
var currentArrayElement = +gets();
// Обработваш го
}
Добре, а как да взимам дължината на масив? С input.length?
Да, с input.length
вземаш всички елементи от масива. Когато имаш задача в която първият елемент е броя на следващите елементи
let input = [
'3',
'10',
'20',
'30',
];
С input.length ще ти върне 4. Общо колко елемента има в масива.
с +gets() вземаш първият, най-горният, който ти е броя на следващите редове и в масива ти остава:
let n = +gets(); // Тук вземаш 3
let input = [
'10',
'20', // Оставащи елементи
'30',
];
Следващият път когато имаш +gets() отново ще вземе най-горният, първият елемент
let next_n = +gets(); // 10
let input = [
'20', // Оставащи елементи
'30',
];
Това +gets() работи на база индекс, но просто за сега го приеми, че взема и ти връща най-горният елемент.
input.length
винаги ще ти връща 4, тоест броя елементи(всички).
Тоест:
Дори няколко пъти да извикаш +gets() и да вземаш елементи, input.length винаги ще показва колко са всички елементи от масива.
Това е защото +gets() не трие, а премества индекс, но да не задълбаваме.
Просто го запомни така към момента:
let length = input.length; // 4
let next_next_n = +gets(); // 20 и не измислих по-адекватно име за променливата
let input = [
'30' // Оставащи елементи
];
Дано съм ти бил полезен, ако нещо друго не ти е ясно, драскай смело.
Даже много си ми полезен . Аз знам за индексите в масив - [ 0, 1, 2, 3, 4, …]. Gets взима първия индекс(0). Как gets премества индекса?
Днес пробвах тази задача Find Largest Three Values и направих това https://jsfiddle.net/mo2atkue/1/?fbclid=IwAR21QeUN_SDBh4Se2Wc-JHQi1apF0oKw9Y71bmTd93iWrkq-WrL5JCjLx60. Не можах да измисля нищо по начина, по който ти ми каза.
Този код не работи така или иначе.
Като цяло срещам големи трудности на циклите, за разлика от предишните раздели и ще продължа да ви досаждам .
Хммм, за тази задача е малко по… tricky.
Можеш да я решиш по няколко начина.
Първи вариант:
Вкарай въображение. Вместо да търсиш кои са най-големите 3 числа, можеш просто да сортираш масива и да вземеш последните 3 които не се повтарят. Още по-елегантен подход ще е да изкараш само различните числа, сортирани в нов масив. От него без проверки само си вземаш последните 3 числа.
let n = +gets();
let arr = [];
for (let i = 0; i < n; i++) {
let element = +gets();
arr.push(element);
}
let sortedArray = arr.sort((a, b) => a - b);
let first = sortedArray[arr.length - 1];
let second = sortedArray[arr.length - 2];
let third = sortedArray[arr.length - 3];
print(first + `, ` + second + ` and ` + third);
Друг вариант за решение е:
Правиш си 3 променливи като им задаваш най-ниска възможна стойност:
let first = Number.MIN_SAFE_INTEGER;
let second = Number.MIN_SAFE_INTEGER;
let third = Number.MIN_SAFE_INTEGER;
Пускаш for цикъл през масива и за всяко число проверяваш дали е по малко от first, second, third.
for (i = 1; i <= n; i++) {
let currentValue = +gets();
if (currentValue >= first) {
third = second;
second = first;
first = currentValue;
} else if (currentValue >= second) {
third = second;
second = currentValue;
} else if (currentValue >= third) {
third = currentValue;
}
Дебъгни кода за да ти стане по-ясно какво се случва.
Ако currentValue е по-голямо число от first, значи то е новото най-голямо и first става равно на currentValue. Но преди това трябва да пренаредиш другите стойности.
Новото трето число е старото второ, новото второ е старото първо, новото първо е currentValue.
Същото се повтаря и за другите.
Съвет!!! Не прави copy, paste. Давам ти така решения за да ги разгледаш и дебъгнеш.
По-важно е да разбереш логиката на нещата, а не 100-те точки, затова отдели време да дебъгнеш двете решения и да схванеш защо и как работи.
Благодаря, разбира се, че не правя copy, paste. Гледам да разбера принципите и после сам да напиша програмата.
Тук for (i = 1; i <= n; i++) имаш грешка. Трябва да е for (i = 0; i <= n; i++).
Аз вчера бях направил това https://jsfiddle.net/mo2atkue/1/?fbclid=IwAR21QeUN_SDBh4Se2Wc-JHQi1apF0oKw9Y71bmTd93iWrkq-WrL5JCjLx60. Но не работи.
Само тази функция тук не можах да разбера. Ако може да обясниш?
Разбира се.
Прочети това: https://www.javascripttutorial.net/javascript-array-sort/
В общи линии: Когато дадеш .sort()
на някой масив, той се сортира по default-ни правила.
Тоест:
Имаме масив
let input = [
'2',
'4',
'3',
'5',
'1',
];
Пускаш един for цикъл който да мине през всички числа и да ги изпринтира на конзола:
let input = [
'2',
'4',
'3',
'5',
'1',
];
for (let i = 0; i < input.length; i++) {
console.log(input[i]);
}
Сега output на конзолата ще ти е 2 4 3 5 1
Очаквано.
Но ако добавиш input.sort(); ще сортира масива по предварително дефиниран начин. От най-малко към по-голямо.
let input = [
'2',
'4',
'3',
'5',
'1',
];
input.sort();
for (let i = 0; i < input.length; i++) {
console.log(input[i]);
}
// Output: 1 2 3 4 5
Но какво правиш ако искаш да сортираш масива във низходящ ред, тоест от най-голямото число към по-малко.
Тогава можеш във функцията .sort()
да кажеш начина по който да се сортира.
.sort((a, b) => b - а)
буквално се чете: Вземи две числа от масива (a, b)
и ги пресметни b - a
и ако след операцията b - a
резултатът е по-голям от 0 значи ‘b’ е по-голямо, изкарай на предна позиция b
.
(a, b) подаваш две числа на функцията и от изчислението което правиш, къде поставяш лявото и дясното число, казваш дали във възходяш или низходящ ред да ги сортира.
(a, b) => а - b) - Второто число трябва да е по-малко
(a, b) => b - а) - Второто число трябва да е по-голямо
let input = [
'2',
'4',
'3',
'5',
'1',
];
input.sort();
for (let i = 0; i < input.length; i++) {
console.log(input[i]);
}
// Output: 1 2 3 4 5
input.sort((a, b) => a - b); // a - b стандартно поведение
for (let i = 0; i < input.length; i++) {
console.log(input[i]);
}
// Output: 1 2 3 4 5
input.sort((a, b) => b - a); // Второ число минус първото. От по-глямо към по-малко
for (let i = 0; i < input.length; i++) {
console.log(input[i]);
}
// Output: 5 4 3 2 1
И прочети това: https://www.javascripttutorial.net/javascript-array-sort/
Страхотно обяснение.
Как да превърна масив в редица от номера https://jsfiddle.net/dwoxbuj7/1/?
https://learn.telerikacademy.com/mod/page/view.php?id=5310&forceview=1
Изхода ми е масив от номера.
Има и доста по-лесен начин, мисля някъде се споменаваше още в първите уроци - чрез метода map
За него засега е достатъчно да знаеш, че оперира с всеки елемент от масива, и в случая го прави на число.
let input = ['3', '43', '55', '12', '2'];
input = input.map(Number); // [ 3, 43, 55, 12, 2 ]
Изхода ми трябва да е това Output: 6, 5, 3, 2, 1.
На мен и без map масива ми е съставен от номера.
Въпроса ми беше как да имам такъв изход като във условието.
И това не работи https://jsfiddle.net/bu84L59g/1/. Защото изхода е string.
Предполагам проблема ти е как вземаш входните данни - те доколкото виждам са просто един стринг, а ти ги вземаш като масив.
Здравей,
забележи, че входа ти е даден като един цял стринг, в който числата са разделени от запетая и интервал (, ). Стринговете имат метод split (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/split), който превръща стинга на субстрингове и ги връща в масив. Както Симо каза по-горе, следващата стъпка е да превърнеш стринговете в числа, за да можеш да ги сортираш. Програмата би сработила и без превръщането, но аз бих се подсигурил. Накрая използваш метод join на масиви, като разделяш по запетая.
Не можах да се справя. Може ли да ми пратите решение?
https://pastebin.com/0bVwhQzC това е едно примерно решение. Опитай се да разбереш как става взимането на входните данни когато имаш като вход един стринг от символи, разделени по някакъв начин.
Числата могат да се представят по същия начин и с numbersArray.reverse(); .
Защо винаги използвате arrow функцията?