Javascript 用O(logN)查找未配对整数
我偶然发现了这个测验: 给出了一个由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上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中除一个以外的所有值都出现偶数次 这是我的解决方案,它不被认
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,但是的,它是有效的!