Javascript 优化阵列中奇数出现的时间复杂度

Javascript 优化阵列中奇数出现的时间复杂度,javascript,arrays,time-complexity,Javascript,Arrays,Time Complexity,我有这样一段代码,它将数组中的相同元素配对,期望数组具有奇数长度,并且它应该返回唯一无法获得配对的元素。因此,我编写的代码写得很好,对于较小的数组来说效果很好,但是对于超过10亿的非常大的整数,时间复杂度变为O(N**2),然后需要重构代码,以便在大型数组和大型数组元素中获得更好的性能。下面是我的代码 function solution(A) { if(!Array.isArray(A)) return 0; var temp = new Array(A.length); var positi

我有这样一段代码,它将数组中的相同元素配对,期望数组具有奇数长度,并且它应该返回唯一无法获得配对的元素。因此,我编写的代码写得很好,对于较小的数组来说效果很好,但是对于超过10亿的非常大的整数,时间复杂度变为O(N**2),然后需要重构代码,以便在大型数组和大型数组元素中获得更好的性能。下面是我的代码

function solution(A) {
if(!Array.isArray(A)) return 0;

var temp = new Array(A.length);
var position = 0;

for(let i=0; i<A.length; i++){
    if(temp.includes(A[i])){
        position = temp.indexOf(A[i]);
        index = A.indexOf(A[i]);
        delete temp[position];
        delete A[index];
        delete A[i];
    }else{
        temp[i] = A[i];
    }
}

for(let j=0; j<A.length; j++){
    if(A[j] !== undefined) return A[j];
    else continue;
}
}
函数解决方案(A){
如果(!Array.isArray(A))返回0;
var temp=新阵列(A.长度);
var位置=0;

对于(设i=0;i我们可以尝试使用对象的强大功能来查找一次迭代中的奇数。对象是键-值对。因此,访问对象键的权限是
O(1)
。因此,当我们遇到相同的元素时,我们只需增加值:

const hashMap = arr.reduce((a, c)=> {
  a[c] = a[c] || 0;
  a[c] += 1;
  return a;
},{})
const result = Object.keys(hashMap).filter(key => hashMap[key] === 1);
例如:

让arr=[2,3,6,7,3,5,5,6,2];
常量hashMap=arr.reduce((a,c)=>{
a[c]=a[c]| | 0;
a[c]+=1;
返回a;
},{})
const result=Object.keys(hashMap.filter)(key=>hashMap[key]==1);

console.log(result);
我们可以通过使用object的强大功能来尝试在一次迭代中找到奇数。object是键-值对。因此访问object key的权限是
O(1)
。因此,当我们遇到相同的元素时,我们只需增加值:

const hashMap = arr.reduce((a, c)=> {
  a[c] = a[c] || 0;
  a[c] += 1;
  return a;
},{})
const result = Object.keys(hashMap).filter(key => hashMap[key] === 1);
例如:

让arr=[2,3,6,7,3,5,5,6,2];
常量hashMap=arr.reduce((a,c)=>{
a[c]=a[c]| | 0;
a[c]+=1;
返回a;
},{})
const result=Object.keys(hashMap.filter)(key=>hashMap[key]==1);

console.log(result);
您可以使用对象仅存储非成对元素。
请注意,您不需要将所有数组元素及其计数存储在对象中,然后按计数进行过滤(就像@stepp那样)

一切都在一个循环中完成。
函数返回所有非成对元素的数组:

const solution=A=>Array.isArray(A)?
对象密钥(
A.减少((r,k)=>{
r[k]=r[k]| | 0;
如果(++r[k]>1)删除r[k];
返回r;
}, {})
) : [];

log(解决方案([2,3,6,7,3,5,5,6,2]))
您可以使用对象仅存储非成对元素。
请注意,您不需要将所有数组元素及其计数存储在对象中,然后按计数进行过滤(就像@stepp那样)

一切都在一个循环中完成。
函数返回所有非成对元素的数组:

const solution=A=>Array.isArray(A)?
对象密钥(
A.减少((r,k)=>{
r[k]=r[k]| | 0;
如果(++r[k]>1)删除r[k];
返回r;
}, {})
) : [];


log(解决方案([2,3,6,7,3,5,5,6,2]))
你能把源数据写成文本,把所需数据写成文本吗?@steppup,我刚刚编辑并包含了源数据和所需数据。你能把源数据写成文本,把所需数据写成文本吗?@steppup,我刚刚编辑并包含了源数据和所需数据。这看起来很好,我一直在分析你所做的事情,刚刚学会了reduce method,我能够看到您如何为每个值映射一个递增键(如果它是成对的),然后为一位数映射一个递增键,这不会给我们带来结果。但是在您刚刚编写的代码中,我仍然需要了解很多东西。谢谢。@optimalresource我很高兴它对您有所帮助!请随时提问!:)@请看科什的答案,它的复杂度为O(N)。我的答案的复杂度为O(2*N)。使用他的答案。这比我的答案好。将他的答案标记为答案,以简化其他用户的未来搜索。你将获得更好的性能。是的,我发现了复杂性,这真的很酷。我已经接受了它作为最佳答案。这看起来很好,我一直在分析你所做的事情,刚刚学会了reduce方法,并且能够看到它是如何实现的您为每个值映射了一个递增的键(如果它是成对的),然后为一位数映射了一个递增的键,没有递增的结果。但是,在您刚刚编写的代码中,有很多东西我仍然需要理解。谢谢。@optimalresource我很高兴它对您有所帮助!请随时提问!:)@optimalresource请参阅Kosh答案,它已经完成了O(N)复杂性。我的答案有复杂性O(2*N).使用他的答案。这比我的答案好。将他的答案标记为答案,以简化其他用户的未来搜索。你将获得更好的性能。是的,我发现了复杂性,这真的很酷。我已经接受了它作为最佳答案。我还没有真正理解你刚才所做的一切,它返回的是一个整数对象,我如何返回just该对象中的第一个整数?@optimalresource,函数返回数组,您可以按索引获取其任何元素。是的,我找到了,我尝试解码您所做的一切。谢谢lot@optimalresource,很乐意帮忙。是的,我也这么想,它应该成为其他人的资源,我在所有可能的条件下对它进行了测试ns和它脱颖而出。现在我了解了关于映射、过滤器和reduce的大多数事情,以及它们可以链接的方式,因为@Kosh真的让我感觉很好,在看到它的美丽之后,我的肾上腺素有了很大的跳升。我还没有真正弄清楚你刚才做的一切,它返回的是一个整数对象,我如何只返回第一个整数ger在那个对象中?@optimalresource,函数返回数组,你可以按索引获取它的任何元素。是的,我知道了,我试着解码你所做的一切。谢谢lot@optimalresource,很乐意帮忙。是的,我也这么想,它应该成为其他人的资源,我在所有可能的条件下对它进行了测试,它经得起考验t、 现在我了解了大多数关于地图、过滤器和reduce的事情,以及它们可以被链接的方式,因为@Kosh真的让我感觉很好,在看到美丽之后,我的肾上腺素有了很大的提升。