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;}}
}
加油!!!