袋子里有 n 个白球,m 个黑球 (0<= n+m <= 100000)
每一次操作从袋中拿出两个球,若为两个白球或两个黑球就放回一个白球,一黑一白就放回一个黑球
求当袋子中只剩下一个球时,球的颜色是什么
乍一看我深吸一口气,这题好难,但是转念一想,黑球和白球的放回逻辑与二进制中的 0 和 1 的异或逻辑是一样的
根据题目的描述,我们可以将白球当成是二进制中的 0,黑球当做二进制里的1,将所有的结果异或后得到的结果就是最终留下的球的花色
注:前置知识:
① 任何数异或或 0 等于它本身
② 无论一个序列的顺序如何交换,它的亦或结果都是一样的
代码如下:
static String judge(int n,int m){
int xor = 0;
//这一步可以省略,因为亦或0是无效操作,这里写出是为了便于理解
for(int i=0;i<n;i++){
xor ^= 0;
}
//这一步可以简化为 -> xor = m % 2 == 0 ? 0 : 1;
for(int i=0;i<m;i++){
xor ^= 1;
}
return xor == 0 ? "白" : "黑";
}
简化后的代码:
static String judge(int n,int m){
return m % 2 == 0 ? "白" : "黑";
}
我们测试一下运行结果
测试代码:
public static void main(String[] args) {
for(int i=0;i<5;i++){
for(int j=0;j<5;j++){
System.out.println(i+" "+j+" 最终颜色judge1:"+judge1(i,j)+" ----- 最终颜色judge2:"+judge2(i,j));
}
}
}
运行结果:
0 0 最终颜色judge1:白 ----- 最终颜色judge2:白
0 1 最终颜色judge1:黑 ----- 最终颜色judge2:黑
0 2 最终颜色judge1:白 ----- 最终颜色judge2:白
0 3 最终颜色judge1:黑 ----- 最终颜色judge2:黑
0 4 最终颜色judge1:白 ----- 最终颜色judge2:白
1 0 最终颜色judge1:白 ----- 最终颜色judge2:白
1 1 最终颜色judge1:黑 ----- 最终颜色judge2:黑
1 2 最终颜色judge1:白 ----- 最终颜色judge2:白
1 3 最终颜色judge1:黑 ----- 最终颜色judge2:黑
1 4 最终颜色judge1:白 ----- 最终颜色judge2:白
2 0 最终颜色judge1:白 ----- 最终颜色judge2:白
2 1 最终颜色judge1:黑 ----- 最终颜色judge2:黑
2 2 最终颜色judge1:白 ----- 最终颜色judge2:白
2 3 最终颜色judge1:黑 ----- 最终颜色judge2:黑
2 4 最终颜色judge1:白 ----- 最终颜色judge2:白
3 0 最终颜色judge1:白 ----- 最终颜色judge2:白
3 1 最终颜色judge1:黑 ----- 最终颜色judge2:黑
3 2 最终颜色judge1:白 ----- 最终颜色judge2:白
3 3 最终颜色judge1:黑 ----- 最终颜色judge2:黑
3 4 最终颜色judge1:白 ----- 最终颜色judge2:白
4 0 最终颜色judge1:白 ----- 最终颜色judge2:白
4 1 最终颜色judge1:黑 ----- 最终颜色judge2:黑
4 2 最终颜色judge1:白 ----- 最终颜色judge2:白
4 3 最终颜色judge1:黑 ----- 最终颜色judge2:黑
4 4 最终颜色judge1:白 ----- 最终颜色judge2:白