问题如下
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗? 示例 1: 输入: [2,2,1] 输出: 1
示例 2: 输入: [4,1,2,1,2] 输出: 4
我的解答如下:
Arrays.sort(nums); if (nums.length == 3){ if(nums[0] != nums[1]){ return nums[0]; } if(nums[1] != nums[2]){ return nums[nums.length-1]; } } for(int i = 1;i<nums.length-2;i++){ if(nums[0] != nums[1]){ return nums[0]; } if(nums[nums.length-2] != nums[nums.length-1] && nums[nums.length-2] == nums[nums.length-3]){ return nums[nums.length-1]; } if(nums[i-1] != nums[i] && nums[i] != nums[i+1]){ return nums[i]; } } return nums[0];
思路: 对数组进行排序 然后将i位置的元素与他前后的元素分别进行比较,如果都不相等表示他是唯一一个出现的,然后处理不相等的数据出现在数组头和尾的情况,最后处理数组长度为3和1的情况,这两种情况按上面的逻辑会数组越界。
给出的效率最高的解法:
int xor = 0; for (int i = 0; i < nums.length; i++ ) { xor ^= nums[i]; } return xor;
其中 ^ 为异或运算符,将数字转换为2进制后按位进行运算,例如:15的2进制表示为1111, 2的2进制表示为0010,那么15^2的结果为1101返回值为13。
a^=b的效果等价于a=a^b。对一个元素连续与另一个元素做两次异或运算后得到的元素还是自己,当对整个数组进行遍历异或运算后最后得到的xor就是所求的唯一的那个。