龙空技术网

每天一算法:「数组」只出现一次的数字

Java技术架构 1386

前言:

此刻我们对“python数组添加数字”大体比较看重,姐妹们都想要剖析一些“python数组添加数字”的相关文章。那么小编在网络上收集了一些有关“python数组添加数字””的相关文章,希望兄弟们能喜欢,咱们快快来学习一下吧!

小编整理了一些经典面试题目清单,将帮助您掌握算法及数据结构,并提高您的编程能力。

编程能力就像任何其他技能一样,也是一个可以通过刻意练习极大提高的。

大多数经典面试题目都有多种解决方案。 为了达到最佳的练习效果,强烈建议您至少将题目练习两遍,如果可以的话,三遍会更好。

刻意练习并不意味着寻找答案并记住它,这种练习方法不是长久之计。 在没有参考答案情况下,越能自主解决问题,才越能提高自身能力。

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例

解题技巧:

位运算中的异或(^):a^b当a和b不相等时为1,相等时为0

算法描述:

将data中的所有元素进行异或运算,然后再将结果与1~n每个元素依次异或,最后得到的结果就是缺少的元素(只出现了一次的元素)。即满足:0 ^ 1 = 1, 1 ^ 0 = 1, 0 ^ 0 = 0, 1 ^ 1 = 0,异或运算又满足交换结合律 a ^ b ^ c = a ^ c ^ b.。

综合以上,再根据我们的数据的特点,有2n-1个数,其中有n-1个数出现了两次,只有一个数出现了1次,那么我们将所有的2n-1个数进行异或时,可以看成如下过程,对于出现了两次的元素,x ^ x = 0,然后是n-1个0和剩余的那个只出现了一次的y进行异或,n-1个0异或的结果还是0,最后再与y异或结果是y,y就是我们要找的缺失的元素。

这个算法,需要将所有元素做异或运算,时间复杂度O(n),空间复杂度O(c),而且不会有溢出的问题,这是面试官最喜欢的答案了。

代码

class Solution {

public int singleNumber(int[] nums) {

int result = 0;

int length = nums.length;

for(int i=0;i<length;i++){

result = result ^ nums[i];

}

return result;

}

}

运行结果:

测试结果

标签: #python数组添加数字