leetcode每日一题(20241209)(20241208补)
leetcode每日一题(20241209)和补一下 (20241208)的这天的
(20241208): 782. 变为棋盘 题目描述:
一个 n x n 的二维网络 board 仅由 0 和 1 组成 。每次移动,你能交换任意两列或是两行的位置。
返回 将这个矩阵变为 “棋盘” 所需的最小移动次数 。如果不存在可行的变换,输出 -1。
“棋盘” 是指任意一格的上下左右四个方向的值均与本身不同的矩阵。
这题目有好多潜规则,如果没碰到过是真的不好做,推荐看官方解析,很详细,下面就是我按照官网解析写的,请看代码(有点长):
class Solution {
public int movesToChessboard(int[][] board) {
//按照官网解题步骤走,不管行行或者列只有两种,取第一行和第一列作为模板
int len=board.length;
int[] maskCol=new int[len];
int[] reverseMaskCol=new int[len];
int[] maskRow=new int[len];
int[] reverseMaskRow=new int[len];
for(int i=0;i<len;i++){
maskCol[i]=board[i][0];
maskRow[i]=board[0][i];
}
for(int i=0;i<len;i++){
reverseMaskCol[i]=(maskCol[i]+1)%2;
reverseMaskRow[i]=(maskRow[i]+1)%2;
}
int rowCount=0; //记录行和模板一样的个数
int colCount=0; //记录列和模板一样的个数
// 检测每一行和每一列是不是只是和模板或者反向模板一样
for(int i=0;i<len;i++){
// 判断列
boolean colFlag=true;
boolean reverseColFlag=true;
for(int j=0;j<len;j++){
if(board[j][i]!=maskCol[j]){
colFlag=false;
break;
}
}
for(int j=0;j<len;j++){
if(board[j][i]!=reverseMaskCol[j]){
reverseColFlag=false;
break;
}
}
if(colFlag||reverseColFlag){
if(colFlag) colCount++;
}else{
return -1;
}
// 判断行
boolean rowFlag=true;
boolean reverseRowFlag=true;
for(int j=0;j<len;j++){
if(board[i][j]!=maskRow[j]){
rowFlag=false;
break;
}
}
for(int j=0;j<len;j++){
if(board[i][j]!=reverseMaskRow[j]){
reverseRowFlag=false;
break;
}
}
if(rowFlag||reverseRowFlag){
if(rowFlag) rowCount++;
}else{
return -1;
}
}
// 获取最小移动次数
int rowMoves=getMoves(maskRow,rowCount,len);
int colMoves=getMoves(maskCol,colCount,len);
return (rowMoves == -1 || colMoves == -1) ? -1 : (rowMoves + colMoves);
}
public int getMoves(int[] mask,int count,int n){
//求出模板中1或者0的个数(1的个数)
int oneNumCount=0;
for(int i=0;i<n;i++){
oneNumCount+=mask[i];
}
//偶数矩阵
if(n%2==0){
if(oneNumCount*2!=n||count*2!=n){
return -1;
}
// 从1 开始 判断和模板有多少差异
int count1=0;
int temp1=1;
int count0=0;
int temp0=0;
for(int i=0;i<n;i++){
if(mask[i]!=(temp1%2)){
count1++;
}
if(mask[i]!=(temp0%2)){
count0++;
}
temp1++;
temp0++;
}
return Math.min(count0,count1)/2; //返回结果要除2 因为挪动一次可以替换两个
}else{
if(Math.abs(oneNumCount*2-n)!=1||Math.abs(count*2-n)!=1){
return -1;
}
int count0=0;
int temp0=1;
if(oneNumCount==n/2){
// 只能是 0 开头的
temp0=0;
}
for(int i=0;i<n;i++){
if(mask[i]!=(temp0%2)){
count0++;
}
temp0++;
}
return count0/2; //返回结果要除2 因为挪动一次可以替换两个
}
}
}
(20241209): 1812. 判断国际象棋棋盘中一个格子的颜色 题目描述:
给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。
和之前 在这里插入代码片
20241203 号每日一题一模一样,就不多说了看代码:
class Solution {
public boolean squareIsWhite(String coordinates) {
return getColor(coordinates);
}
public boolean getColor(String coordinate){
int col=coordinate.charAt(0)-'a';
int row=coordinate.charAt(1)-'0';
if(row%2==0){
return col%2==0?true:false;
}else{
return col%2==0?false:true;
}
}
}
加油!!!
原文地址:https://blog.csdn.net/weixin_44061648/article/details/144360948
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!