Greater Number Mock Exam 4

Greater Number

You are given two arrays where the elements of the first one are subset of the elements of the second one. For each element in the first array, find the next greater element in the second array, starting at the position of the given element.

Input

  • Read from the standard input.
  • On the first line will be the first array of numbers, separated by comma.
  • On the second line will be the second array of numbers, separated by comma.

Output

  • Print the result on the standard output.
  • The result should be the numbers, separated by comma.

Constraints

  • All elements will be unique (the elements from the first array are unique in the first array, the elements from the second array are unique in the second array).
  • The length of both arrays would not exceed 1000.

Здравейте, ударих на камък със задача номер 2 от mock exam 4, като получавам само 50/100 и не мога да разбера къде би могла да бъде грешката.

Ето го кодът ми let input = [[4,1,2 ],[1, 3, 4, 2],];let print = this.print || console.log; - Pastebin.com.

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

1 Like

Здравейте,

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

let input = ['4,1,2', '1,3,4,2'];

let print = this.print || console.log;
let gets =
  this.gets ||
  (
    (arr, index) => () =>
      arr[index++]
  )(input, 0);

const arr1 = gets().split(',').map(Number);
const arr2 = gets().split(',').map(Number);

Така ще си спестите и проверката за isNaN, след като вече всички числа в масива са обрънати от стринг на число. Най-вероятно все още не знаете за map функцията, но просто знайте, че след split като напишете .map(Number) всичко в масива ще е числа :slight_smile:

Ето ви примерни стъпки как можете да решите задачата:

  1. Взимате си 2-та масива от входните данни, както ви показах по-горе.

  2. След това итерирате по първият масив, както и правите

  3. Вместо да имате вложен цикъл можете да използвате следните методи, които би трябвало да знаете на този етап

  • indexOf - така можете да си намерите за текущото число на кой индекс се намира във вторият масив
  • slice - след като имате индекса от вторият масив можете да “изрежете” със този метод само от
    намерения индекс натам или както е по условие (в дясно от текущото число). Така ще имате масив само с числата от дясно на текущото число от първият масив. Тъй като index-а, който ще получите ще е точно за числото тук трябва да се сетите нещо (това число не ви трябва в изрязания масив)
  1. След като имате числата от дясно просто итерирате по тях, ако има по-голямо число измежду тях го бутате в резултата, ако няма бутате -1, както е по условие.

  2. Принтирате резултата с join метода

  3. По условие пише, че масивите ще са само от числа, така че отново проверката isNaN е безсмислена

Успех :slight_smile:

1 Like

Докарах го до 100. Даже някак си и без slice()
Мерси много за помощта!
Имам още доста работа докато свикна кога кой метод да използвам.

1 Like

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

1 Like
const arr1 = gets().split(',').map(Number);
const arr2 = gets().split(',').map(Number);
const result = [];

for (let i = 0; i < arr1.length; i++) {
  const indexOfCurrentNumber = arr2.indexOf(arr1[i]);
  const currentNumbersOnRight = arr2.slice(indexOfCurrentNumber + 1)
  .filter((number) => number > arr1[i]);
  if (currentNumbersOnRight.length > 0) {
    result.push(currentNumbersOnRight[0]);
  } else {
    result.push(-1);
  }


}

print(result.join());

Toва го написах преди да ви дам насоки, че отдавна не бях решавал тук задачи :slight_smile:

В решението изрязвам числата след текущото число от дясно и филтрирам само тези, които са по-големи. Ако филтрирания масив е празен значи няма по-голямо, ако има просто бутам в резултата първото от масива :slight_smile:

1 Like

Eто съкратих го съвсем :slight_smile:


const arr1 = gets().split(',').map(Number);
const arr2 = gets().split(',').map(Number);
const result = [];

for (let i = 0; i < arr1.length; i++) {
  const indexOfCurrentNumber = arr2.indexOf(arr1[i]);
  const currentGreaterNumber = arr2
    .slice(indexOfCurrentNumber + 1)
    .filter((number) => number > arr1[i])[0];

  result.push(currentGreaterNumber || -1);
}

print(result.join());

И последен рефакторинг :slight_smile:. Почти на 1 ред решение.

const arr1 = gets().split(',').map(Number);
const arr2 = gets().split(',').map(Number);
const result = [];

arr1.forEach((n) =>
  result.push(
    arr2.slice(arr2.indexOf(n)).filter((number) => number > n)[0] || -1
  )
);

print(result.join());
1 Like

Наистина има супер много начини за решение, но от по-сложните нищо не разбирам все още :joy:, имам още доста “хляб” да ям, че да Ви настигна и да започна да ги решавам по този начин. Отново благодаря и Ви пожелавам лека вечер.

Ахаха не се притеснявай миналата година по това време и аз бях така, с постоянство лека полека нещата се нареждат.

1 Like

Здравейте! И аз стигнах до тази здача, но не ми стана ясно следното. В дадения пример:
Input
4,1,2
1,3,4,2

Output

-1,3,-1
Explanation
For 4 only 2 is to its right in the second array. There is no greater element, so output -1.

Не намирам в условието, че ако от дясно на намереното число във втория елемент, няма по-голямо, число, в изходния масив се въвежда числото ‘-1’.

Моля Ви да ми помогнете да си изясня случая!

Поздрави и благодаря,
Петър

Screenshot_3

Преди май го пишеше и в условието, но сега го виждам само в примера. Явно нещо са объркали.

Благодаря ти! :grinning:

Здравейте! Опитах се да реша задачата с pyhton, но джъдж ми даде следния резултат:
Test case #1: Accepted [0.05 s, 9.85 MB]
Test case #2: Accepted [0.05 s, 9.85 MB]
Test case #3: Wrong Answer [0.05 s, 9.85 MB]
Test case #4: Accepted [0.05 s, 9.85 MB]
Test case #5: Wrong Answer [0.05 s, 9.85 MB]
Test case #6: Accepted [0.05 s, 9.85 MB]
Test case #7: Accepted [0.05 s, 9.85 MB]
Test case #8: Accepted [0.05 s, 9.85 MB]
Test case #9: Accepted [0.05 s, 9.85 MB]
Test case #10: Wrong Answer [0.05 s, 9.85 MB]
Test case #11: Wrong Answer [0.05 s, 9.85 MB]
Test case #12: Accepted [0.05 s, 9.85 MB]
Test case #13: Wrong Answer [0.05 s, 9.85 MB]
Test case #14: Wrong Answer [0.05 s, 9.85 MB]

Това е кодът:

Моля Ви да ми помогнете да си открия грешката!

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

Така че съм сигурен, че аз греша. :slight_smile:

Поздрави,
Петър

Здравей!

В задачата се иска за всяко число в първия масив да намерим следващото по-голямо от него във втория масив. Т.е. не само да проверим дали числото директно след него е по-голямо, а дали някое от всички останали след него във втория масив не е по-голямо и съответно да принтираме първото такова. Ако променим малко втория пример от задачата:

2,4
2,1,3,4

С тези входни данни ще получим резултат -1,-1, въпреки че има по-голямо число след 2, но така сравняваме само 2 и 1 и получаваме -1 вместо 3.
Измисли как да сравняваш с всички числа след това във втория масив докато не стигнеш до по-голямо или не свърши масива.

Поздрави,
Коко

Благодаря ти за помощта!

Поздрави,
Петър