LeetCode-SingleNumber

本例源码下载地址:SingleNum

题目描述:

《LeetCode-SingleNumber》

题目大意是给定一个非空整形数组,数组内每个元素都出现了2次,只有一个特别的数字出现了一次,希望使用线性时间(0(n))复杂度找出这个只出现一次的数字。

思路:

1、题目已经说清楚了是线性,因此只需要一个循环就能找出。
2、从每个元素出现2次入手,可以利用这个来找出数字的特性。在数学里面,异或运算是指位与位之间遇到相同的则该位结果为0,不同的数为1。因此一个数出现2次,那么他的最后异或运算结果一定是为0。因此把数组分成2类,出现2次的和出现1次的,那么出现2次的数进行异或运算,不管多少个都一定是0。再结合任何数异或0都是其本身这个特点,可以推算最后的结果一定是出现1次的那个数。

让我们用下面的例子来验证一下:
《LeetCode-SingleNumber》

解决方案:

设定一个初始数0(任何数异或0都等于其本身,因此不会对结果造成影响),然后将数组里面的所有数字与其异或,最终结果即为只出现一次的那个数。

public static int singleNum(int[] nums){
       int result = 0;
       int length = nums.length;
       for (int i = 0; i < length; i++){
           result = result ^ nums[i];
       }
       return result;
    }
点赞