Estoy tratando de resolver esta tarea de encontrar el elemento único dentro de una matriz. Hasta ahora logré resolver el 95%, pero estoy fallando en 0. Recibo un error que dice que esperaba 0 y obtuve 1.

Debería obtener // 10, lo cual es así, pero después de que falle la prueba en línea. Para todos los demás valores ha pasado.

¿Alguna idea sobre cómo resolver esto y lo que me falta aquí?

function findOne(arr) {
  let x = arr[0];
  for (let i of arr) {
    if (i === x) {
      continue;
    } else {
      x = i;
    }
    return x;
  }
}
console.log(findOne([3, 10, 3, 3, 3]));
0
Tiago Ruivo 29 oct. 2019 a las 18:09

5 respuestas

La mejor respuesta

Puede obtener todos los valores que aparecen una vez, utilizando un mapa para contar cuántas veces ha aparecido cada elemento. Luego puede reducir ese mapa en una matriz de valores únicos:

const findUnique = arr => {
  const mapEntries = [...arr.reduce((a, v) => a.set(v, (a.get(v) || 0) + 1), new Map()).entries()]
  return mapEntries.reduce((a, v) => (v[1] === 1 && a.push(v[0]), a), [])
}

console.log(findUnique([3, 10, 3, 3, 3]))
console.log(findUnique([1, 2, 3, 2, 4]))
console.log(findUnique([4, 10, 4, 5, 3]))

Si no le interesan los valores únicos múltiples, puede ordenar la matriz y usar la lógica, en lugar de verificar cada valor, siempre que la matriz solo contenga 2 valores diferentes y tenga una longitud mayor que 2:

const findUnique = arr => {
  a = arr.sort((a, b) => a - b)
  if (arr.length < 3 || new Set(a).size === 1) return null
  return a[0] === a[1] ? a[a.length-1] : a[0]
}

console.log(findUnique([3, 10, 3, 3, 3]))
console.log(findUnique([3, 3, 1]))
console.log(findUnique([3, 1]))
console.log(findUnique([3, 3, 3, 3, 3]))
-1
Kobe 29 oct. 2019 a las 15:54

Considere lo siguiente:

Recuerde que a span = max - min + 1;

Deje Partition P1 ser span de 0..span-1;

Deje Partition P2 ser span de span..(2*span)-1:

Coloque un número en P1 si no está en P2.

Coloque un número en P2 si ya está en P1.

Una vez que el número esté en P2, no lo considere nuevamente .

Si un número está en P1 , entonces es único .

0
C. R. Ward 29 oct. 2019 a las 19:11

Tu código es complejo, prueba esto

function findOne(arr) {
  const uniqueItems = [];
  arr.forEach(item => {
    const sameItems = arr.filter(x => x === item);
    if (sameItems.length === 1) {
      uniqueItems.push(item);
    }
  });

  return uniqueItems;
}
console.log(findOne([0, 1, 1, 3, 3, 3, 4]));

Estoy obteniendo todos los elementos únicos de la matriz aprobada, puede tener múltiples elementos únicos

-1
Abdelrhman ElSayed 29 oct. 2019 a las 15:28

Esta es una manera más simple y rápida:

function findOne(arr) {
  const a = arr.reduce((acc, e) => {
    e in acc || (acc[e] = 0)
    acc[e]++
    return acc
  }, {})
  return Object.keys(a).filter(k => a[k] === 1)[0] || null
}
-1
fedeghe 30 oct. 2019 a las 08:21

Realmente no entiendo tu código. Comienza con el primer valor en la matriz, luego recorre la matriz, omite cualquier cosa que sea igual y luego devuelve el primero que no es el mismo. Eso no encontrará valores únicos, solo encontrará el primer valor que no sea igual al primer valor. Entonces, por ejemplo, pruébelo en la matriz [1,2,2,2,2] y obtendrá un resultado de 2 en lugar de 1, aunque eso es claramente incorrecto.

En su lugar, puede crear un mapa de cada valor y su incidencia, luego filtrar por los que equivalen a 1 al final.

function findOne(arr) {
    const incidences = arr.reduce((map, val) => {
      map[val] = (map[val] || 0) + 1;
      return map;
    }, {});
    const values = Object.keys(incidences);
    for (let i = 0; i < values.length; ++i) {
      if (incidences[values[i]] === 1) { return values[i]; }
    }
    return null;
}

EDITAR Lo anterior no conservará el tipo del valor (es decir, lo convertirá en una cadena siempre, incluso si originalmente era un número). Para preservar el tipo, puede usar un Mapa real en lugar de un objeto:

function findOne(arr) {
    const incidences = arr.reduce((map, val) => {
      map.set(val, (map.get(val) || 0) + 1);
      return map;
    }, new Map());
    const singletons = Array.from(incidences).filter(entry => entry[1] === 1);
    return singletons.map(singleton => singleton[0]);
}
0
IceMetalPunk 29 oct. 2019 a las 15:32