Javascript 用O(logN)查找未配对整数

Javascript 用O(logN)查找未配对整数,javascript,performance,Javascript,Performance,我偶然发现了这个测验: 给出了一个由N个整数组成的非空数组A。 数组包含奇数个元素,数组中的每个元素都可以与具有相同值的另一个元素配对,只有一个元素未配对。 例如 A=[9,3,9,3,5,7,5]//3,5和9可以配对,而7可以单独使用 编写一个有效函数,给定一个由N个整数组成的数组,返回未配对元素的值。 注: 1 N是范围[1..1000000]内的奇数整数; 2数组A的每个元素都是[1..100000000]范围内的整数; 3 A中除一个以外的所有值都出现偶数次 这是我的解决方案,它不被认

我偶然发现了这个测验:

给出了一个由N个整数组成的非空数组A。 数组包含奇数个元素,数组中的每个元素都可以与具有相同值的另一个元素配对,只有一个元素未配对。 例如 A=[9,3,9,3,5,7,5]//3,5和9可以配对,而7可以单独使用 编写一个有效函数,给定一个由N个整数组成的数组,返回未配对元素的值。 注: 1 N是范围[1..1000000]内的奇数整数; 2数组A的每个元素都是[1..100000000]范围内的整数; 3 A中除一个以外的所有值都出现偶数次

这是我的解决方案,它不被认为是有效的,因为它的复杂性在**2上

function solution(A) {
    let res;
    A.sort();
    //3,3,7,9,9,9,9    
    while(A.length>1) {
        if(A[0] === A[1]) {
            A.shift();
            A.shift();
        } else {
            res = A[0];
            break;
        }
    }
    res = A.length === 1 ? A[0] : res;
    return res;
} 
我如何从这里改进这一点

以下是失败的测试: 谢谢

这是我根据你的建议写的代码

function solution(A) {
    let mySet = new Set();
    let auxFn;
    A.forEach( item => {
        auxFn = mySet.has(item) ? 'delete' : 'add';
        mySet[auxFn](item);
    });
    return [...mySet][0];
} 
谢谢

这是我根据你的建议写的代码

function solution(A) {
    let mySet = new Set();
    let auxFn;
    A.forEach( item => {
        auxFn = mySet.has(item) ? 'delete' : 'add';
        mySet[auxFn](item);
    });
    return [...mySet][0];
} 

我已经看到了这个问题,您可以对数组中的所有数字进行异或运算,最终结果将是唯一一个未配对的数字。 此解决方案速度相当快,应能满足您的速度要求

小的基本示例:

console.log12^3^3^12^4^5^4


上面的代码将返回5,这是我的示例中唯一一个没有配对的数字。

我已经看到了这个问题,您可以对数组中的所有数字进行异或运算,最终结果将是唯一一个没有配对的数字。 此解决方案速度相当快,应能满足您的速度要求

小的基本示例:

console.log12^3^3^12^4^5^4



上面的代码将返回5,这是在我的示例中唯一一个没有对的数字。

on^2是错误的代码,但是您从哪里获得您的Ologn要求?这不是引用文本的一部分,也没有任何意义。正确的解决方案是ONlogN,它可以通过排序和线性搜索轻松实现。顺便说一下,你的解决方案就是ONlogN。我不确定它是否在这个测试或另一个测试中声明了OlogN,但它肯定是有效的,并且我没有通过几个性能测试:请注意我第一句话中的nollaly。您可以通过不排序来编写更好的算法,但当您从左到右解析数组一次时,您可以使用一个集合来检查您正在解析的元素是否存在,如果存在,您可以从集合中删除配对,如果不存在,则只需添加它。最后,打印场景的内容,这是你的独行侠。它很快就奏效了。谢谢你,伙计!^2上的代码不好,但您从哪里获得您的Ologn要求?这不是引用文本的一部分,也没有任何意义。正确的解决方案是ONlogN,它可以通过排序和线性搜索轻松实现。顺便说一下,你的解决方案就是ONlogN。我不确定它是否在这个测试或另一个测试中声明了OlogN,但它肯定是有效的,并且我没有通过几个性能测试:请注意我第一句话中的nollaly。您可以通过不排序来编写更好的算法,但当您从左到右解析数组一次时,您可以使用一个集合来检查您正在解析的元素是否存在,如果存在,您可以从集合中删除配对,如果不存在,则只需添加它。最后,打印场景的内容,这是你的独行侠。它很快就奏效了。谢谢你,伙计!是的,我肯定不能用JS编写代码,我甚至不知道返回参数是什么意思。要么描述算法,要么用C写出来。如果你想用C写,我会把答案设置为正确的。目标是找到一种比给定语言中的代码更好的优化方法。顺便说一句,返回将集合解包成不同的值…mySet,将它们放入数组[],并将位于位置0[0]的一个标记为正确答案,XOR技巧是这个问题的真正解决方案:是的,我肯定不能用JS编写代码,我甚至不知道返回参数的含义。要么描述算法,要么用C写出来。如果你想用C写,我会把答案设置为正确的。目标是找到一种比给定语言中的代码更好的优化方法。顺便说一句,返回值将集合解包为不同的值…mySet,将它们放入数组[],并将位于位置0[0]的一个标记为另一个答案正确,XOR技巧是这个问题的真正解决方案:哇,这是一些低级编程技巧。你怎么会有这样的想法。在你看到它之后,这完全是有道理的,但实际上我不可能认为在一个十亿年里,这正是我所想的:d,但是的,它是有效的!哇,这是一些低级的编程技巧。你怎么会有这样的想法。在你看到它之后,这完全是有道理的,但实际上我不可能认为在一个十亿年里,这正是我所想的:d,但是的,它是有效的!