一、题目
给你一个坐标 coordinates
,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。
如果所给格子的颜色是白色,请你返回 true
,如果是黑色,请返回 false
。
给定坐标一定代表国际象棋棋盘上一个存在的格子。坐标第一个字符是字母,第二个字符是数字。
二、示例
2.1> 示例 1:
【输入】coordinates = "a1"
【输出】false
【解释】如上图棋盘所示,"a1" 坐标的格子是黑色的,所以返回 false 。
2.2> 示例 2:
【输入】coordinates = "h3"
【输出】true
【解释】如上图棋盘所示,"h3" 坐标的格子是白色的,所以返回 true 。
2.3> 示例 3:
【输入】coordinates = "c7"
【输出】false
提示:
- coordinates.length ==
2
- '
a
' <= coordinates[0] <= 'h
' - '
1
' <= coordinates[1] <= '8
'
三、解题思路
3.1> 采用异或方式
首先:针对题目中的棋盘,我们可以针对 行 和 列 ,做出如下假设性的拆分
操作:
【棋盘中列的假设】:
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,然后计算异或即可。
3.2> 采用奇偶方式
我们以a1
格子为例,a的ASCII码为97
,1的ASCII码为49
,那么ASCII(a) + ASCII(1) = 97 + 49 = 146,那么当总和是偶数
时,则格子是黑色
;如果总和是奇数
时,则格子是白色
。
此处就不再画图赘述了。
四、代码实现
4.1> 采用异或方式
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;
}
}
4.2> 采用奇偶方式
class Solution {
public boolean squareIsWhite(String coordinates) {
return (coordinates.charAt(0) + coordinates.charAt(1)) % 2 == 1; // 白色用奇数表示,黑色用偶数表示
}
}
今天的文章内容就这些了:
写作不易,笔者几个小时甚至数天完成的一篇文章,只愿换来您几秒钟的 点赞 & 分享 。
更多技术干货,欢迎大家关注公众号“爪哇缪斯” ~ \(^o^)/ ~ 「干货分享,每天更新」