Я пытаюсь решить эту задачу поиска уникального элемента внутри массива. Пока мне удалось решить 95%, но я терплю неудачу на 0. Я получаю ошибку, говорящую, что ожидал 0 и получил 1.
Я должен получить // 10, что он делает, но после того, как я провалил тест в Интернете. Для всех других значений это прошло.
Любые идеи о том, как решить эту проблему и что мне здесь не хватает?
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]));
5 ответов
Вы можете получить все значения, которые появляются один раз, используя карту, чтобы посчитать, сколько раз появился каждый элемент. Затем вы можете уменьшить эту карту в массив уникальных значений:
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]))
Если вас не волнует несколько уникальных значений, вы можете просто отсортировать массив и использовать логику, а не проверять каждое значение, при условии, что массив содержит только 2 разных значения и имеет длину больше 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]))
Обратите внимание на следующее.
Напомним, что span = max - min + 1;
Пусть Partition P1
будет span
из 0..span-1
;
Пусть Partition P2
будет span
из span..(2*span)-1
:
Поместите число в P1
, если его нет в P2
.
Поместите число в P2
, если оно уже есть в P1
.
Если число указано в P2
, больше его не рассматривать .
Если число находится в P1
, оно уникально .
Ваш код сложный, попробуйте это
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]));
Я получаю все уникальные предметы из переданного массива, он может иметь несколько уникальных предметов
Это намного проще и быстрее:
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,2,2,2,2]
, и вы получите результат 2 вместо 1, хотя это явно неправильно.
Вместо этого вы можете создать карту каждого значения и его падения, а затем отфильтровать по тем, которые равны 1 в конце.
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;
}
РЕДАКТИРОВАТЬ . Вышеприведенное не сохранит тип значения (т. е. оно всегда преобразует его в строку, даже если изначально она была числом). Чтобы сохранить тип, вы можете использовать реальную карту вместо объекта:
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]);
}
Похожие вопросы
Связанные вопросы
Новые вопросы
javascript
По вопросам программирования на ECMAScript (JavaScript/JS) и его различных диалектах/реализациях (кроме ActionScript). Обратите внимание, что JavaScript — это НЕ Java. Включите все теги, относящиеся к вашему вопросу: например, [node.js], [jQuery], [JSON], [ReactJS], [angular], [ember.js], [vue.js], [typescript], [стройный] и т. д.