【发布时间】:2018-03-14 03:46:39
【问题描述】:
我有一个这样的数组
students = [{name: 'Abbey', age: 25}, {name: 'Brian', age: 45},
{name: 'Colin', age: 25}, {name: 'Dan', age: 78}]
我希望输出是;
uniqueAges = [45, 78]
需要明确的是,如果学生数组中出现多次的年龄值,我不希望在我的 uniqueAges 数组中任何具有该年龄的对象。 “Abbey”和“Colin”的年龄相同,所以他们都出局了。
我知道我可以这样做并运行uniqueAgeGetter(students)
function uniqueAgeGetter(list){
var listCopy = list.slice();
var uniqueAges = list.slice();
for (var i = list.length - 1; i >= 0; i--) {
for (var j = listCopy.length - 1; j >= 0; j--) {
if(listCopy[j].name !== list[i].name &&
listCopy[j].age == list[i].age){
uniqueAges.splice(i, 1)
}
}
}
console.log(uniqueAges)
return uniqueAges
}
但是是否可以在没有第二个循环的情况下做到这一点?我不是时间复杂度方面的专家,但我试图找出这个任务是否可能是 O(n)。
编辑:
我不是在问uniqueAgeGetter 是否被重写以更好地阅读或使用诸如 map、reduce 或 filter 之类的函数(因为我的理解是它们最终也是一个循环)。
我的问题是可以以降低时间复杂度的方式重构 uniqueAgeGetter 吗?可以只用一个循环完成吗?
谢谢。
【问题讨论】:
-
尝试使用设置
-
@oybek
Set很棒,但尚未得到广泛支持 -
如前所述,
O(n)的复杂性是完全可能的。但是,在一次迭代中 不可能在所有元素上获得格式良好的 array[45, 78]的输出。 (这里的所有解决方案都需要对多个元素进行一次以上的迭代)但是,将在仅对元素进行一次迭代的同时在 Set 中获得所需的输出。那是你感兴趣的东西吗? -
@Victor 绝大多数浏览器都支持 Sets。它们是 ES2015 的一个特性,在大多数情况下,只有 非常 没有更新的过时浏览器不理解 Sets。
标签: javascript node.js algorithm time-complexity