面试经典150题(29-31)

leetcode 150道题 计划花两个月时候刷完,今天(第十四天)完成了4道(29-32)150:

今天这是矩阵,真的全是模拟(我是菜狗。。),好恶心啊。

29.(有效的数独) 题目描述:

bash 复制代码
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。

第一版(真的要看清除题,我之前没注意,以为输入的不一定是9×9的,后面判断小方块时候有点棘手,看了题目才发现是固定9×9的。。,我是纯模拟做的。)

java 复制代码
class Solution {
    public boolean isValidSudoku(char[][] board) {
        //数字 1-9 在每一行只能出现一次。
        int len=board.length;
        int[] key=new int[10];
        for(int i=0;i<len;i++){
            key=new int[10];
            for(int j=0;j<len;j++){
                int temp=board[i][j]-48;
                if(temp>=0&&temp<=9){
                    if(key[temp]!=0){
                        return false;
                    }
                    key[temp]++;
                }
            }
        }
        //数字 1-9 在每一列只能出现一次。
        for(int i=0;i<len;i++){
            key=new int[10];
            for(int j=0;j<len;j++){
                int temp=board[j][i]-48;
                if(temp>=0&&temp<=9){
                    if(key[temp]!=0){
                        return false;
                    }
                    key[temp]++;
                }
            }
        }
        //数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次
         int count=0;
         key=new int[10];
         for(int index=0;index<3;index++){
            for(int i=0;i<len;i++){
                for(int j=index*3;j<index*3+3;j++){
                    int temp=board[i][j]-48;
                    if(temp>=0&&temp<=9){
                        if(key[temp]!=0){
                            return false;
                        }
                        key[temp]++;
                    }
                }
             if(i%3==2){
                 key=new int[10];
             }
            }
         }
        return true;
    }
}

30.(54. 螺旋矩阵)题目描述:

bash 复制代码
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
输入:matrix = [ 
[1,2,3],
[4,5,6],
[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

第一版(这个我还是稍微想了想,用了一点点想法,虽然还是模拟,但是我感觉我这个比解题的方法要好很多。。)

java 复制代码
class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int left=0;
        int right=0;
        int start=matrix.length-1;
        int end=matrix[0].length-1;
        List<Integer> spiralOrder=new ArrayList();
        while(left<=start&&right<=end){
            if(left==start&&right==end){
                spiralOrder.add(matrix[start][end]);
                break;
            }
            // 一行
            if(left==start){
                for(;right<=end;right++){
                    spiralOrder.add(matrix[left][right]);
                }
                break;
            }
            // 一列
            if(right==end){
                for(;left<=start;left++){
                    spiralOrder.add(matrix[left][right]);
                }
                break;
            }
            // 一圈-》一行 一列 一行 一列
            int temp=right;
            //一行
            for(;temp<=end;temp++){
                spiralOrder.add(matrix[left][temp]);
            }
            temp=left+1;
            //一列
            for(;temp<=start;temp++){
                spiralOrder.add(matrix[temp][end]);
            }
            temp=end-1;
            // 一行
            for(;temp>=right;temp--){
                spiralOrder.add(matrix[start][temp]);
            }
            //一列
            temp=start-1;
            for(;temp>left;temp--){
                spiralOrder.add(matrix[temp][right]);
            }
            left++;
            right++;
            start--;
            end--;
        }
        return spiralOrder;
    }
}

31.(48. 旋转图像)题目描述:

bash 复制代码
给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。
你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

第一版(这个是真的没想到不额外用数组怎么调换位置,看看我菜鸡第一版)

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {
        int len=matrix.length;
        int[][] res=new int[len][len];
        for(int i=0;i<len;i++){
            for(int j=0;j<len;j++){
                res[i][len-j-1]=matrix[j][i];
            }
        }
       for(int i=0;i<len;i++){
           for(int j=0;j<len;j++){
               matrix[i][j]=res[i][j];
           }
       }
    }
}

第二版(看了解题,真的太牛了还有公式。。但是就感觉最后一个先水平反转,再主对角线反转这个方法好)

java 复制代码
class Solution {
    public void rotate(int[][] matrix) {
        int len=matrix.length;
        //水平翻转
        for(int i=0;i<len/2;i++){
            for(int j=0;j<len;j++){
                int temp=matrix[i][j];
                matrix[i][j]=matrix[len-i-1][j];
                matrix[len-i-1][j]=temp;
            }
        }
        //主对角反转(/)  这个要好好理解,我反正一知半解
        for(int i=0;i<len;i++){
            for(int j=0;j<i;j++){
                int temp=matrix[i][j];
                matrix[i][j]=matrix[j][i];
                matrix[j][i]=temp;
            }
        }

    }
}

32.(73. 矩阵置零)题目描述:

bash 复制代码
给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
输入:matrix = [[1,1,1],[1,0,1],[1,1,1]]
输出:[[1,0,1],[0,0,0],[1,0,1]]
输入:matrix = [[0,1,2,0],[3,4,5,2],[1,3,1,5]]
输出:[[0,0,0,0],[0,4,5,0],[0,3,1,0]]

第一版(这个我感觉不是很难。。但是写完发现别人的这个想法是真的牛)

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int len=matrix.length;
        int with=matrix[0].length;
        Set<Integer> rowSet=new HashSet();
        Set<Integer> colSet=new HashSet();
        for(int i=0;i<len;i++){
            for(int j=0;j<with;j++){
                if(matrix[i][j]==0){
                    rowSet.add(i);
                    colSet.add(j);
                }
            }
        }
        for(Integer row:rowSet){
            for(int j=0;j<with;j++){
                matrix[row][j]=0;
            }
        }
        for(Integer col:colSet){
            for(int i=0;i<len;i++){
                matrix[i][col]=0;
            }
        }
    }
}

第二版(来看看,大神的想法。。是真的佩服,boolean 还能这样用!!)

java 复制代码
class Solution {
    public void setZeroes(int[][] matrix) {
        int len=matrix.length;
        int with=matrix[0].length;
        boolean[] rowSet=new boolean[len];
        boolean[] colSet=new boolean[with];
        for(int i=0;i<len;i++){
            for(int j=0;j<with;j++){
                if(matrix[i][j]==0){
                    rowSet[i]=true;
                    colSet[j]=true;
                }
            }
        }
        for(int i=0;i<len;i++){
            for(int j=0;j<with;j++){
                if(rowSet[i]||colSet[j]){
                    matrix[i][j]=0;
                }
            }
        }
    }
}

今天这些题太麻烦了,都需要找规律,但是还行能用笨办法写出来也是进步。

加油,早日跳槽!!!

相关推荐
over6972 小时前
从 LLM 到全栈 Agent:MCP 协议 × RAG 技术如何重构 AI 的“做事能力”
面试·llm·mcp
SuperEugene3 小时前
Vue状态管理扫盲篇:如何设计一个合理的全局状态树 | 用户、权限、字典、布局配置
前端·vue.js·面试
AI软著研究员4 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish4 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱5 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
Sailing5 小时前
🚀 别再乱写 16px 了!CSS 单位体系已经进入“计算时代”,真正的响应式布局
前端·css·面试
SuperEugene8 小时前
Vue状态管理扫盲篇:Vuex 到 Pinia | 为什么大家都在迁移?核心用法对比
前端·vue.js·面试
Hilaku8 小时前
我会如何考核一个在简历里大谈 AI 提效的高级前端?
前端·javascript·面试
前端Hardy9 小时前
别再用 $emit 满天飞了!Vue 3 组件通信的 4 种正确姿势,第 3 种 90% 的人不知道
前端·vue.js·面试
我叫黑大帅9 小时前
前端如何利用 GitHub Actions 自动构建并发布到 GitHub Pages?
前端·面试·github