No pude entender por qué pasé 22/23 en este desafío y no pude resolver el último caso de prueba ya que estaba oculto. Los comentarios de CodeSignal son
Pruebas superadas: 22/23. Límite de tiempo de ejecución excedido: el programa excedió el límite de tiempo de ejecución. Asegúrese de que complete la ejecución en unos segundos para cualquier entrada posible.
Desafío Dada una matriz a que contiene solo números en el rango de 1 a a.longitud, encuentra el primer número duplicado para el cual la segunda ocurrencia tiene el índice mínimo. En otras palabras, si hay más de 1 número duplicado, devuelve el número para el que la segunda aparición tiene un índice más pequeño que la segunda aparición del otro número. Si no hay tales elementos, devuelve -1.
Ejemplo
Para a = [2, 1, 3, 5, 3, 2], la salida debe ser solución (a) = 3.
Hay 2 duplicados: los números 2 y 3. La segunda aparición de 3 tiene un índice más pequeño que la segunda aparición de 2, por lo que la respuesta es 3.
Para a = [2, 2], la salida debe ser solución (a) = 2; Para a = [2, 4, 3, 5, 1], la salida debe ser solución (a) = -1.
De entrada y salida
[límite de tiempo de ejecución] 4 segundos (js)
[entrada] array.integer a
Restricciones garantizadas: 1 ≤ a.length ≤ 105, 1 ≤ a[i] ≤ a.length.
[salida] entero
El elemento en a que ocurre en la matriz más de una vez y tiene el índice mínimo para su segunda aparición. Si no hay tales elementos, devuelve -1.
Mi código
function solution(a) { let first = Infinity for ( let i = 0; i<a.length; i++ ) { let pointer = i+1; while (pointer <a.length) { if (a[i] === a[pointer] && pointer<first) { first = pointer; } pointer +=1 } } if (first === Infinity) { return -1 } return a[first] }Gracias.
En casos malos, está iterando sobre toda la matriz para cada elemento en ella: O(n ^ 2) . El while(pointer < a.length) hace que el argumento tome demasiado tiempo.
En su lugar, cree un Conjunto de elementos encontrados hasta el momento y regrese cuando se encuentre el primer elemento duplicado (que será el segundo índice mínimo).
const solution = (a) => { const set = new Set(); for (const item of arr) { if (set.has(item)) return item; set.add(item); } return -1; }; Dado que esto no tiene un bucle anidado ( .has y .add es O(1) ), esto es O(n) en general, lo que debería ser lo suficientemente rápido.