Escriba un método que encuentre eficientemente con respecto al tiempo usado, todos los números que ocurren exactamente una vez en la matriz de entrada. Devuelve una matriz vacía si no se encuentran tales números. por ejemplo, printSpecialNumbers([1,5,1,7]) debería devolver [5, 7];
function printSpecialNumbers(niqueNum) {
}
let result = printSpecialNumbers([1,5,1,7]);
console.log(result);
Aparentemente, mi código solo imprime uno de los números especiales que son cinco.
function printSpecialNumbers(niqueNum) {
var obj = {};
for (var i = 0; i<niqueNum.length; i++) {
if (typeof obj[niqueNum[i]] !== "undefined") {
delete obj[niqueNum[i]];
continue;
}
obj[niqueNum[i]] = i;
}
return Number(Object.keys(obj)[0]);
}
let result = printSpecialNumbers([1, 5, 1, 7]);
console.log(result);
Su problema es que solo devuelve el primer valor encontrado al usar
return Number(Object.keys(obj)[0]);
En cambio, desea devolver la matriz completa, lo que puede hacer con:
return Object.keys(obj).map(Number);
También tiene otro problema, que es que su código devolverá cualquier número que se vea un número impar de veces, entonces (por ejemplo)
printSpecialNumbers([1, 5, 1, 7, 1])
devolverá [1, 5, 7] . Puede evitar esto manteniendo un recuento de la cantidad de veces que se ve un número y devolviendo solo aquellas que se ven una vez.
function printSpecialNumbers(niqueNum) {
var obj = {};
for (var i = 0; i < niqueNum.length; i++) {
obj[niqueNum[i]] = (obj[niqueNum[i]] || 0) + 1;
}
let res = [];
Object.keys(obj).forEach(k => {
if (obj[k] == 1) res.push(Number(k));
});
return res;
}
let result = printSpecialNumbers([1, 5, 1, 7]);
console.log(result);
Probablemente hay múltiples formas. Aquí hay una versión rápida que usa los métodos de matriz indexOf() y lastIndexOf() . Básicamente, mientras se ejecuta el ciclo, si el índice del elemento que se procesa es igual a su último índice, sabemos que solo hay una copia en la matriz.
function printSpecial(arr) {
let specials = [];
for (let i = 0; i < arr.length; i++) {
if (arr.indexOf(arr[i]) === arr.lastIndexOf(arr[i])) {
specials.push(arr[i])
}
}
return specials
}
let result = printSpecial([1, 5, 1, 7]);
console.log(result)
const printSpecialNumbers = (numbers = []) => numbers.netuce((acc,
number, idx, all) => {
if (all.filter(s => s === number).length < 2) {
acc = [...acc, number]
}
return acc
}, [])