Loading...

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

d_alexiev avatar d_alexiev -1 Точки

Задача: еднакви двойки / JAVA SCRIPT

Здравейте, имам повече свободно време и съм се хванал да гледам видеата и чета учебника за JS едновременно. Има доста обяснени задачи във видео уроците, но не намерих за тази за JS конкретно. Не мога да схвана как да си вземам 2х2 двойките числа с цикъла? Някой може ли да даде линк ако има към видео с обяснена тази задача или да обясни съвсем бейсик без методи/функции, а по най-елементарния начин. Задача: еднакви двойки Дадени са 2 * n числа. Първото и второто формират двойка, третото и четвъртото също и т.н. Всяка двойка има стойност – сумата от съставящите я числа. Напишете програма, която проверява дали всички двойки имат еднаква стойност. В случай, че е еднаква отпечатайте "Yes, value=…" + стойността, в противен случай отпечатайте максималната разлика между две последователни двойки в следния формат - "No, maxdiff=…" + максималната разлика. Входът се състои от число n, следвано от 2*n цели числа, всички по едно на ред. Вход: 4 1 1 3 1 2 2 0 0 No, maxdiff=4; стойности = {2, 4, 4, 0} разлики = {2, 0, 4} макс. разлика = 4
Тагове:
0
Programming Basics 02/06/2020 16:38:36
MartinBG avatar MartinBG 4803 Точки

Въртите цикъл по "n",  като на всяка итерация четете по две числа от входните данни.

 

Ето примерно решение, което - вярвам, използва само неща, от PB модула:

 

function solve(input) {
  let previousPairSum = NaN;
  let maxPairDifference = 0;

  const pairs = Number.parseInt(input.shift());

  for (let i = 0; i < pairs; i++) {
    const firstNumber = Number.parseInt(input.shift());
    const secondNumber = Number.parseInt(input.shift());
    const currentPairSum = firstNumber + secondNumber;

    if (isNaN(previousPairSum)) {
      previousPairSum = currentPairSum;
    }

    const differenceWithPreviousPair = Math.abs(previousPairSum - currentPairSum);

    if (differenceWithPreviousPair > maxPairDifference) {
      maxPairDifference = differenceWithPreviousPair;
    }

    previousPairSum = currentPairSum;
  }

  if (maxPairDifference !== 0) {
    console.log(`No, maxdiff=${maxPairDifference}`);
  } else {
    console.log(`Yes, value=${previousPairSum}`);
  }
}

 

0
02/06/2020 18:55:07
d_alexiev avatar d_alexiev -1 Точки
Благодаря за съдействието, но може ли да се реши без shift(), ако напиша input[i] или input[i0], влизайки в цикъла нали ще инкрементира и ще вземе следващия елемент? Или input[i]+input[i+1]. Знам, че shift премахва първия елемент от масива, но се твърди в уроците, да не се ползват в начален етап, а да се решават първоначално без тях. Също не ми е ясно това -> const pairs = Number.parseInt(input.shift()); Как взема чифт, като всъщност премахва едно и как хем Number, хем parseInt? Това let previousPairSum = NaN; също го срещам за първи път? Ако не е число? Между другото исках все пак да я тествам, пробвам да заместя shift() , обаче изкарва грешка тук " const pairs = Number.parseInt(input.shift());" В една друга тема намерих решение преди да пусна темата, но нещо пак избива грешка. (https://pastebin.com/S2cdeqKR) Другото решение изглежда по-достъпно като за начинаещ, но като гледам би работила, само ако е с две двойки, нещо като лява и дясна част, защото като почва от 3 да върти и вземе другите 2 (едновременно гледам върти през 2??? взема 3тия и 5тия елемент ли?) И как ще вземе после следващите 2 елемента да ги сметне и да ги сравни, ако са повече от две двойки? С една дума ми трябват разяснения да схвана като за баш начинаещ :)
-1
03/06/2020 15:21:44
MartinBG avatar MartinBG 4803 Точки

@d_alexiev

Когато срещнете нещо непознато в код, най-лесното и правилно нещо е да го потърсите в интернет и да опитате да го разберете:

 

Number.parseInt() - parses a string argument and returns an integer.

Трябва ни, защото входните данни идват като масив от стрингове, напр.: ['4', '1', '1', '3', '1', '2', '2', '0', '0']

 

Array.prototype.shift() - removes the first element from an array and returns that removed element.

Това е най-удобният и естесвен начин, входните данни да бъда изконсумирани последователно без да пишем излишен код, което ни помага да се фокусираме върху проблема, който трябва да решим в задачата

 

NaN - a value representing Not-A-Number

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

 

За да се реши задачата без използване на shift(), трябва да се използва глобален индекс за достъпване на елементите, който да се увеличава след всяко използване:

function solve(input) {
  let previousPairSum = NaN;
  let maxPairDifference = 0;

  let index = 0;
  const pairs = Number.parseInt(input[index++]);

  for (let i = 0; i < pairs; i++) {
    const firstNumber = Number.parseInt(input[index++]);
    const secondNumber = Number.parseInt(input[index++]);
    const currentPairSum = firstNumber + secondNumber;

    if (isNaN(previousPairSum)) {
      previousPairSum = currentPairSum;
    }

    const differenceWithPreviousPair = Math.abs(previousPairSum - currentPairSum);

    if (differenceWithPreviousPair > maxPairDifference) {
      maxPairDifference = differenceWithPreviousPair;
    }

    previousPairSum = currentPairSum;
  }

  if (maxPairDifference !== 0) {
    console.log(`No, maxdiff=${maxPairDifference}`);
  } else {
    console.log(`Yes, value=${previousPairSum}`);
  }
}

 

0
03/06/2020 23:28:36
d_alexiev avatar d_alexiev -1 Точки

Благодаря Ви, че си отделихте от свободното време за начинаещ като мен. 

Вместо Number.parseInt() - на мен ми е известен варианта с array.map(Number), но пак опираме до това, че има "map" използвано.

Изпробвах варианта с Number.parseInt(), но ми конвертира само първия елемент в число - 

let a = ["4","5","8"];

let b = Number.parseInt(a);

console.log(b); 

 

Същото е и така:

let a = ["2","6","7"];

let index = 0;

let b = Number.parseInt(a[index++]);

console.log(b);

 

Къде греша?

Защо при стартирането на програмата при какъвто и да е вход ми изкарва винаги "Yes, value=NaN"? При Вас сработва ли?

0
04/06/2020 12:25:17
MartinBG avatar MartinBG 4803 Точки

@d_alexiev

Предплагам Ви убягва това, че елементите се достъпват във for цикъл:

let arr = ["2","6","7"];

for (let index = 0; index < arr .length; index++) { // тялото на цикъла ще се изпълни 3 пъти
    let b = Number.parseInt(arr [index]);
    console.log(b); // ще отпечата последователно 2, 6, 7 - всяко на нов ред
}

 

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

0
04/06/2020 14:37:13
d_alexiev avatar d_alexiev -1 Точки

function equalPairs(pairs){

pairs = pairs.map(Number);

let count = pairs[0];

let firstNumber = pairs[1];

let secondNumber = pairs[2];

let sum = firstNumber + secondNumber;

let difference = 0;

for(let i=3; i<=count*2; i+=2){

    let firstNumberInLoop = pairs[i];

    let secondNumberInLoop = pairs[i+1];

    let sum1 = firstNumberInLoop+secondNumberInLoop;

 

    let differenceBetweenPairs = Math.abs(sum - sum1);

    if(differenceBetweenPairs>difference){

        difference=differenceBetweenPairs;   

    }else if(differenceBetweenPairs==0){

        sum=sum1;

    }

  }

  if(difference==0){

    console.log("Yes, value = " + sum);

  }else{

    console.log("No, maxdiff = " +  difference);

  }

}

equalPairs([4,1,1,3,1,2,2,0,0]);

Поиграх си и това за мен е най-разбираемият и достъпен начин като решение, но не ми отчита резултата , когато имам две нули не ги смята за резултат? Все едно ги няма?

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