我如何 select 数组中的唯一元素?
How can I select a unique element in the array?
我正在尝试解决在数组中查找唯一元素的任务。
到目前为止,我设法解决了 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]));
我不是很懂你的代码。您从数组中的第一个值开始,然后遍历数组,跳过任何相同的值,然后 return 第一个不相同的值。这不会找到唯一值,它只会找到不等于第一个值的第一个值。因此,例如,在数组 [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;
}
EDIT 以上不会保留值的类型(即它会始终将其转换为字符串,即使它最初是一个数字)。要保留类型,您可以使用实际的 Map 而不是对象:
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]);
}
你可以得到所有出现一次的值,通过使用一个映射来统计每个元素出现了多少次。然后,您可以将该映射缩减为唯一值数组:
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]))
你的代码很复杂,试试这个
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]));
我正在从传递的数组中获取所有唯一项,它可能有多个唯一项
考虑以下因素:
回想一下 span = max - min + 1;
设 Partition P1
来自 0..span-1
;
span
设 Partition P2
为 span
来自 span..(2*span)-1
:
如果不在 P2
中,请将数字放在 P1
中。
如果数字已经在 P1
中,请在 P2
中放置一个数字。
一旦号码在P2
,不再考虑.
如果一个数字在 P1
中,那么它是唯一的。
这种方式更简单快捷:
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
}
我正在尝试解决在数组中查找唯一元素的任务。 到目前为止,我设法解决了 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]));
我不是很懂你的代码。您从数组中的第一个值开始,然后遍历数组,跳过任何相同的值,然后 return 第一个不相同的值。这不会找到唯一值,它只会找到不等于第一个值的第一个值。因此,例如,在数组 [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;
}
EDIT 以上不会保留值的类型(即它会始终将其转换为字符串,即使它最初是一个数字)。要保留类型,您可以使用实际的 Map 而不是对象:
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]);
}
你可以得到所有出现一次的值,通过使用一个映射来统计每个元素出现了多少次。然后,您可以将该映射缩减为唯一值数组:
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]))
你的代码很复杂,试试这个
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]));
我正在从传递的数组中获取所有唯一项,它可能有多个唯一项
考虑以下因素:
回想一下 span = max - min + 1;
设 Partition P1
来自 0..span-1
;
span
设 Partition P2
为 span
来自 span..(2*span)-1
:
如果不在 P2
中,请将数字放在 P1
中。
如果数字已经在 P1
中,请在 P2
中放置一个数字。
一旦号码在P2
,不再考虑.
如果一个数字在 P1
中,那么它是唯一的。
这种方式更简单快捷:
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
}