javascript - 使用 for 循环修改函数以提高效率
问题描述
我正在创建一个从数组参数返回唯一整数的函数。我写了一个有效的函数,但它太慢了。该函数通过了所有逻辑测试但超时。
这些函数接受如下参数:
[9,2,1,2,1,6,1,1,6,2,8,1,8]
我的功能:
function findUnique(numbers) {
let unqNumber, matchCount,i,y;
let len = numbers.length;
for (i = 0; i < len; i++ ) {
matchCount = 0;
for (y = 0; y < len; y++ ) {
if (numbers[i] == numbers[y]) {
matchCount++;
}
}
if (matchCount == 1) {
unqNumber = numbers[i]
}
}
return unqNumber;
}
它将每个索引与所有其他索引进行比较并计算出现次数。仅出现 1 次的索引是唯一编号。
传入的数组中总是只有一个唯一的数字。
我知道 for 循环效率低下,但我不知道另一种写法。我可以使用 filter() 或 map() 更快更有效地完成此任务吗?
解决方案
使用哈希图。当前代码的复杂度为 O(n*n)。使用 hashmap,它将是 O(n)。
例如)
var temp = [9,2,1,2,1,6,1,1,6,2,8,1,8];
function findUnique(numbers)
{
let unqNumber,i;
let len = numbers.length;
var mymap = {};
for(i = 0; i < len; i++)
{
if(numbers[i] in mymap)
{
mymap[numbers[i]]++;
}
else
{
mymap[numbers[i]] = 1;
}
}
console.log(mymap);
//{1: 5, 2: 3, 6: 2, 8: 2, 9: 1}
for(var j in mymap)
{
if(mymap[j] == 1)
{
unqNumber = j;
}
}
return unqNumber;
}
console.log(findUnique(temp));
//9
推荐阅读
- javascript - 基于原型的构造函数和 ES6 类的区别
- android - Flutter/Dart, Switch:又抛出一个异常:A RenderFlex 右侧溢出 99640 像素
- python - Flask App 不调用 Babel localeselector
- c# - Foreach 多态性
- laravel-5 - 将 laravel zip 文件上传到 000webhost 后出错
- vue.js - Auth0:管理 Lambda 函数的身份验证
- c++14 - C ++中的缓冲区概念是什么?
- ruby - 当前文件夹上带有 Ruby REPL 的 Docker
- media - MediaWiki - 如何在图库中使用类别中的所有图像
- ada - 让 GPS 显示我的包子文件夹