自学内容网 自学内容网

leetcode每日一题(20241209)(20241208补)

leetcode每日一题(20241209)和补一下 (20241208)的这天的

(20241208): 782. 变为棋盘 题目描述:

一个 n x n 的二维网络 board 仅由 01 组成 。每次移动,你能交换任意两列或是两行的位置。
返回 将这个矩阵变为  “棋盘”  所需的最小移动次数 。如果不存在可行的变换,输出 -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)!