给你一个坐标 coordinates
,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。
如果所给格子的颜色是白色,请你返回 true
,如果是黑色,请返回 false
。
给定坐标一定代表国际象棋棋盘上一个存在的格子。坐标第一个字符是字母,第二个字符是数字。
【输入】coordinates = "a1" 【输出】false 【解释】如上图棋盘所示,"a1" 坐标的格子是黑色的,所以返回 false 。
【输入】coordinates = "h3" 【输出】true 【解释】如上图棋盘所示,"h3" 坐标的格子是白色的,所以返回 true 。
【输入】coordinates = "c7" 【输出】false
2
a
' <= coordinates[0] <= 'h
'1
' <= coordinates[1] <= '8
'首先:针对题目中的棋盘,我们可以针对 行 和 列 ,做出如下假设性的拆分
操作:
【棋盘中列的假设】:
a列
白色、b列
黑色、c列
白色、d列
黑色…… 【棋盘中行的假设】:1行
黑色、2行
白色、3行
黑色、4行
白色……
然后,我们再观察棋盘中的格子,发现如下规律:
【规律1:白色 + 黑色 = 黑色】 以
a1
为例,此格子是黑色的,由于这个格子是由a列+1行组成,即:a列(白色) + 1行(黑色) = a1(黑色)
; 【规律2:白色 + 白色 = 白色】 以a2
为例,此格子是白色的,由于这个格子是由a列+2行组成,即:a列(白色) + 2行(白色) = a2(白色)
; 【规律3:黑色 + 黑色 = 白色】 以b1
为例,此格子是白色的,由于这个格子是由b列+1行组成,即:b列(黑色) + 1行(黑色) = b1(白色)
;
最后,我们发现这种规律与 异或操作 是一样的,即:白色用0表示,黑色用1表示:
【规律1:白色 + 黑色 = 黑色】0^1等于1 【规律2:白色 + 白色 = 白色】0^0等于0 【规律3:黑色 + 黑色 = 白色】1^1等于0
所以,我们只需要将coordinates指定的行和列转换为0或1,然后计算异或即可。
我们以a1
格子为例,a的ASCII码为97
,1的ASCII码为49
,那么ASCII(a) + ASCII(1) = 97 + 49 = 146,那么当总和是偶数
时,则格子是黑色
;如果总和是奇数
时,则格子是白色
。
此处就不再画图赘述了。
class Solution {
public boolean squareIsWhite(String coordinates) { // 白色用0表示,黑色用1表示
int letter = (coordinates.charAt(0) - 'a') % 2; // a列:白色 b列:黑色 c列:白色 ……
int number = (coordinates.charAt(1) - '1' + 1) % 2; // 1行:黑色 2行:白色 3行:黑色 ……
return (letter ^ number) == 0;
}
}
class Solution {
public boolean squareIsWhite(String coordinates) {
return (coordinates.charAt(0) + coordinates.charAt(1)) % 2 == 1; // 白色用奇数表示,黑色用偶数表示
}
}