题解 | #牛的编号异或问题#
牛的编号异或问题
https://www.nowcoder.com/practice/b8139d2af0f64e6489f69cb173f170c1
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param left int整型
* @param right int整型
* @return int整型
*/
public int rangeBitwiseXor(int left, int right) {
return xorRange(right) ^ xorRange(left - 1);
}
// 辅助函数,用于计算从 1 到 n 的数值的异或结果
// 连续数字的异或遵循以下模式:
// 若 n % 4 = 0,则 XOR(1, 2, 3, ..., n) = 0
// 若 n % 4 = 1,则 XOR(1, 2, 3, ..., n) = n
// 若 n % 4 = 2,则 XOR(1, 2, 3, ..., n) = 1
// 若 n % 4 = 3,则 XOR(1, 2, 3, ..., n) = n + 1
private int xorRange(int n) {
if (n % 4 == 0) {
return n;
} else if (n % 4 == 1) {
return 1;
} else if (n % 4 == 2) {
return n + 1;
} else {
return 0;
}
}
}
- 将整数按照余数0、1、2、3分组,每组内的数异或为0。
- 因此只需关注每组的一个代表元素:余0:代表元素为left,余1:代表元素为1,余2:代表元素为left+1,余3:代表元素为0
- 右端点right根据其余数,决定取哪个代表元素进行异或运算
- 最终根据left的余数取代表元素,与right对应的代表元素异或,就得到了整个区间的异或结果

查看1道真题和解析