Кодилити — FrogRiverOne

Вопрос.

A small frog wants to get to the other side of a river. The frog is initially located on one bank of the river (position 0) and wants to get to the opposite bank (position X+1). Leaves fall from a tree onto the surface of the river.
You are given an array A consisting of N integers representing the falling leaves. A[K] represents the position where one leaf falls at time K, measured in seconds.
The goal is to find the earliest time when the frog can jump to the other side of the river. The frog can cross only when leaves appear at every position across the river from 1 to X (that is, we want to find the earliest moment when all the positions from 1 to X are covered by leaves). You may assume that the speed of the current in the river is negligibly small, i.e. the leaves do not change their positions once they fall in the river.
For example, you are given integer X = 5 and array A such that:
A[0] = 1   A[1] = 3   A[2] = 1   A[3] = 4   A[4] = 2   A[5] = 3   A[6] = 5   A[7] = 4
In second 6, a leaf falls into position 5. This is the earliest time when leaves appear in every position across the river.
Write a function:that, given a non-empty array A consisting of N integers and integer X, returns the earliest time when the frog can jump to the other side of the river.
If the frog is never able to jump to the other side of the river, the function should return −1.
For example, given X = 5 and array A such that:
A[0] = 1   A[1] = 3   A[2] = 1   A[3] = 4   A[4] = 2   A[5] = 3   A[6] = 5   A[7] = 4
the function should return 6, as explained above.
Write an efficient algorithm for the following assumptions:
N and X are integers within the range [1..100,000];
each element of array A is an integer within the range [1..X].

При чтении этого вопроса. Поначалу это может сбивать с толку, так как есть много ненужной информации, которая просто отвлекает.

Простая версия этого вопроса.

  • Найдите самое раннее время, представленное индексом, когда все листья находятся в положениях от 1 до X.
  • Если X = 5. Нам нужно иметь позиции 1,2,3,4,5, чтобы сформировать мост, чтобы добраться до другой стороны реки. Найдите время, когда последняя створка встанет на место.
  • Если у нас есть, 1,2,4,5 возвращают -1, потому что мост не может быть сформирован.
  • Только 1 лист на позицию, без дублирования.

Для начала.

  1. Нам нужно создать пустую новую карту, которая будет содержать каждую позицию.
  2. Нам нужно перебрать массив A, чтобы получить каждую позицию.
  3. Проверьте, есть ли на нашей карте эта позиция. Если нет, добавьте эту позицию на нашу карту.
  4. Затем проверьте размер карты. Если размер равен X, мост из листьев завершен. Возврат i, представляющий время.
  5. Если размер не равен X, перейти к следующему индексу.
  6. Когда в конце массива и размер !== X. Мы можем сделать вывод, что мост неполный. Возврат -1.

Пример

A= [1,3,1,4,2,3,5,4]   X= 5
A[0]=1 exist? map{1:true}  size=1
A[1]=3 exist? map{1:true, 3:true}  size=2
A[2]=1 exist? map{1:true, 3:true}  size=2
A[3]=4 exist? map{1:true, 3:true, 4:true}  size=3
A[4]=2 exist? map{1:true, 3:true, 4:true, 2:true}  size=4
A[5]=3 exist? map{1:true, 3:true, 4:true, 2:true}  size=4
A[6]=5 exist? map{1:true, 3:true, 4:true, 2:true, 5:true}  size=5
5===5 return 6

Решение

function solution(X, A) {    
  const counts = new Map();   
  for (let i = 0; i < A.length; i++) {      
    let positon = A[i]       
    if (!counts.has(positon)) {      
      counts.set(positon, true)    
    }       
    if (counts.size === X) {         
      return i     
    }   
 }   
 return -1
}


Map
Объект содержит пары «ключ-значение
и запоминает исходный порядок вставки ключей. Любое значение (как объекты, так и…developer.mozilla.org»