异或运算的性质:
任何一个数字异或它自己都等于0。也就是说,如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些出现两次的数字全部在异或中抵消掉了。
例:leetCode136
136. 只出现一次的数字
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
解题思路:找到只出现一次的元素,使用异或来解决
不论什么一个数字异或它自己都等于0。也就是说。假设我们从头到尾依次异或数组中的每个数字,那么终于的结果刚好是那个仅仅出现一次的数字。由于那些出现两次的数字所有在异或中抵消掉了。
class Solution {
public:
int singleNumber(vector<int>& nums) {
for(int i=1;i<nums.size();i++)nums[0]^=nums[i];
return nums[0];
}
};
例 leetCode389
389. 找不同 (异或运算)
2018年09月05日 16:41:37 阅读数:5
给定两个字符串 s 和 t,它们只包含小写字母。
字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例:
输入:
s = "abcd"
t = "abcde"
输出:
e
解释:
'e' 是那个被添加的字母。
解题思路:通过异或运算,找到s+t中唯一出现过一次的字符
class Solution {
public:
char findTheDifference(string s, string t) {
char r=0;
for(char c:s+t){
r^=c;
}
return r;
}
};