给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
这道题要求时间复杂度是o(n),空间复杂度是o(1)。难点在于空间复杂度,所以最开始我们很容易想到的hash的方式肯定是不行的。那就要找数组本身有没有什么性质了,本题考查的是异或运算。
先复习一下异或运算,同为0,异为1:
0 ^ 0=0,1 ^ 0=1,0 ^ 1=1,1 ^ 1=0。
同时异或具有如下性质:
假设题目中描述的数组为 [A1,A1,A2,A2,…,An,An,Ax]。其中,Ax 只出现一次,其余的元素都出现两次。对该数组中的所有元素进行异或运算可得:
[A1,A1,A2,A2,…,An,An,Ax] 的乱序序列异或
= A1 ^ A1 ^ A2 ^ A2… ^ An ^ An ^ Ax
= (A1 ^ A1) ^ (A2 ^ A2)… ^ (An ^ An) ^ Ax
= 0 ^ 0… ^ Ax
= Ax
因此,只需要遍历数组中的所有元素,依次进行两两异或操作就可以找出只出现一次的元素。
class Solution {
public int singleNumber(int[] nums) {
int ret = nums[0];
for (int i = 1; i < nums.length; ++i) {
ret ^= nums[i];
}
return ret;
}
}
本文分享自 Leetcode名企之路 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!