关于一些运算法则
1. a ⊕ a = 0
2. a ⊕ b = b ⊕ a
3. a ⊕b ⊕ c = a ⊕ (b ⊕ c) = (a ⊕ b) ⊕ c;
4. d = a ⊕ b ⊕ c 可以推出 a = d ⊕ b ⊕ c.
5. a ⊕ b ⊕ a = b.
我举例说明一下法则5的运用。
例题:已知一串只含大于0的int型整数的数字,其中大部分数都出现了两次,但只有一个数只出现了一次,求这个数的值。
如5 5 3 2 2 1 3,数字5,3,2都出现了两次,而只有1只出现了一次,所以这串数字的答案为1。又如3,4,5,5,4,2,3 的答案为2。
对于这题,可以使用hash数组,但可能会使用过大的空间。如果用异或就简单许多了。因为a⊕a=0; 0⊕b=b;a⊕b⊕a=b;
如5 5 3 2 2 1 3求异或 5 ⊕ 5 ⊕ 3 ⊕ 2 ⊕ 2 ⊕ 1 ⊕ 3 = 5 ⊕ 5 ⊕ 3 ⊕ 3 ⊕ 2 ⊕ 2 ⊕ 1 = 0 ⊕ 0 ⊕ 0 ⊕ 1 = 1;数列中出现两次的数5,3,2在异或都将得出0,因此得出只出现一次的数字1。
这题只要将所有数字异或即可得只出现一次的数字。而且这方法极大的节约了空间和时间。