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