📅  最后修改于: 2023-12-03 15:07:51.681000             🧑  作者: Mango
本文介绍如何在给定区间[L,R]内查找数字的XOR,即[L^ L+1^ L+2^ ... ^ R]。
暴力枚举,时间复杂度O(n),n为区间内数字的个数。
int XOR(int L, int R) {
int res = L;
for (int i = L + 1; i <= R; i++) {
res ^= i;
}
return res;
}
利用性质,时间复杂度O(1)。
偶数个数字的异或结果为0,奇数个数字的异或结果为最后一个数字。因此,当[L,R]内数字的个数为偶数时,异或结果为0;否则,异或结果为[L,R]中最后一个数字。
int XOR(int L, int R) {
int len = R - L + 1;
if (len % 2 == 0) {
return 0;
} else {
return R;
}
}
利用XOR的性质,时间复杂度O(1)。
[L,R]所有数的异或结果,等价于0到L-1所有数异或结果与0到R所有数异或结果的异或结果。因此,只需计算0到L-1所有数字的异或结果与0到R所有数字异或结果的异或值即可。
int XOR(int L, int R) {
int res = 0;
for (int i = 1; i < L; i++) {
res ^= i;
}
for (int i = 1; i <= R; i++) {
res ^= i;
}
return res;
}