面试经典150题【31-40】

news2024/10/1 23:30:29

文章目录

  • 面试经典150题【31-40】
    • 76.最小覆盖字串
    • 36.有效的数独
    • 54.螺旋矩阵
    • 48.旋转图像
    • 73.矩阵置零
    • 289.生命游戏
    • 383.赎金信
    • 205.同构字符串
    • 290.单词规律
    • 242.有效的字母异位词

面试经典150题【31-40】

76.最小覆盖字串

在这里插入图片描述
基本思路很简单,就是先移动右边到合适位置。再移动左边到破戒,再移动位置到合适位置。
判断合适位置是 count0, 此时need[] 里面也都是0 或 <0 的元素。

public class LC76 {
    public String minWindow(String s, String t) {
        if(s == null || s.isEmpty() ||t==null || t.isEmpty()){
            return "";
        }
        int []need=new int[128];
        for(int i=0;i<t.length();i++){
            need[t.charAt(i)]++;
        }


        //l是当前左边界,r是当前右边界,size记录窗口大小,count是需求的字符个数,start是最小覆盖串开始的index
        int l = 0, r = 0, size = Integer.MAX_VALUE, count = t.length(), start = 0;
        //如果need[]<0,说明无关紧要。如果need[]==0,则说明是被需要关注的元素
        while(r<s.length()){
            //对右边进行处理
            char c=s.charAt(r);
            if(need[c]>0){  //是值得关注的元素
                count--;
            }
            need[c]--;
            if(count==0){ //已经塞满了关注的元素了
                //移动左指针
                while(l<r && need[s.charAt(l)]<0){
                    need[s.charAt(l)]++;
                    l++;
                }
                //此时need==0,说明又满足了,开始统计
                if(r-l+1<size){
                    size = r-l+1;
                    start = l;
                }
                //又要向右移动,但是肯定和最小值无关了,开始破戒
                need[s.charAt(l)]++;
                l++;
                count++;
            }
            r++;
        }
        return size == Integer.MAX_VALUE ? "" : s.substring(start, start + size);
    }
}

36.有效的数独

一定是9×9的,
在第 i 个行中是否出现过
在第 j 个列中是否出现过
在第 j/3 + (i/3)*3个box中是否出现过.
定义三个数组,int [][]row, row[i][j], i代表第几行,j代表出现的元素。
box[i][j], i代表第几个小格子,j代表出现的元素。
在这里插入图片描述

class Solution {
    public boolean isValidSudoku(char[][] board) {
        int[][] row = new int[9][10];
        int[][] col = new int[9][10];
        int[][] box = new int[9][10];
        for (int i = 0; i < 9; i++) {
            for (int j = 0; j < 9; j++) {
                if (board[i][j] == '.') {
                    continue;
                }
                int curNum = board[i][j] - '0';
                if (row[i][curNum] == 1) {
                    return false;
                }
                if (col[j][curNum] == 1) {
                    return false;
                }
                if (box[j / 3 + (i / 3) * 3][curNum] == 1) {
                    return false;
                }
                row[i][curNum] = 1;
                col[j][curNum] = 1;
                box[j / 3 + (i / 3) * 3][curNum] = 1;
            }
        }
        return true;

    }
}

54.螺旋矩阵

在这里插入图片描述

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        int m = matrix.length;
        int n = matrix[0].length;
        int up = 0;
        int down = m - 1;
        int left = 0;
        int right = n - 1;
        List<Integer> ans = new ArrayList<>();
        while (true) {
            for (int i = left; i <= right; i++)
                ans.add(matrix[up][i]);
            if (++up > down)
                break;
            for (int i = up; i <= down; i++)
                ans.add(matrix[i][right]);
            if (--right < left)
                break;
            for (int i = right; i >= left; i--)
                ans.add(matrix[down][i]);
            if (--down < up)
                break;
            for (int i = down; i >= up; i--)
                ans.add(matrix[i][left]);
            if (++left > right)
                break;
        }

        return ans;

    }
}

48.旋转图像

关键是找到公式: matrix[i][j] -> matrix[j][n-1-i]
在这里插入图片描述

class Solution {
    public void rotate(int[][] matrix) {
        int n = matrix.length;
        for (int i = 0; i < n / 2; i++) {
            for (int j = 0; j < (n + 1) / 2; j++) {
                int tmp = matrix[i][j];
                matrix[i][j] = matrix[n - 1 - j][i];
                matrix[n - 1 - j][i] = matrix[n - 1 - i][n - 1 - j];
                matrix[n - 1 - i][n - 1 - j] = matrix[j][n - 1 - i];
                matrix[j][n - 1 - i] = tmp;
            }
        }

    }
}

73.矩阵置零

给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。
还是用两个辅助数组,一个判断某一行,一个判断某一列。舒服。

289.生命游戏

暴力模拟就行。dxdy代表你移动的旁边的8个位置。

int[] dx = { -1, 1, 0, 0, -1, -1, 1, 1 };
int[] dy = { 0, 0, -1, 1, -1, 1, -1, 1 };
 for (int k = 0; k < 8; k++) {
       int nx = x + dx[k];
       int ny = y + dy[k];
       if (nx < 0 || nx >= m || ny < 0 || ny >= n)
           continue;
            // 如果这个位置为 0,代表当前轮是死的,不需要算进去
            // 如果这个位置为 1,代表当前轮是活得,需要算进去
            // 如果这个位置为 2,代表当前轮是死的(状态10,下一轮是活的),不需要算进去
            // 如果这个位置为 3,代表是当前轮是活的(状态11,下一轮也是活的),需要算进去
       cnt += (board[nx][ny] & 1);
}

383.赎金信

int[] a = new int[26]; 用这个做个小哈希表就行

205.同构字符串

每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上。
要满足最后一条,应该建立两个hash表, m ->t ; t->m
如果只建立一个hash表, abb -> rrr 会成立,但是其应该不成立。

290.单词规律

也是典型的双射问题,两个哈希表就解决了。
如果两个字符串完全不一样,也可以只用一个哈希表。利用hashmap的put操作的返回值的特性。
如果key不存在,插入成功,返回null;如果key存在,返回之前对应的value。
先将字符串截断 String[] words = str.split(" ");
然后用map.put(words[i],i) 与 map.put(s[i],i)判等就行

242.有效的字母异位词

也是hashmp,第一个字符串遍历去++,第二个字符串遍历去–。
最后判断是否所有元素均为0即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472192.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

docker容器配置mysql5.7主从复制

介绍 本文将通过docker创建3个mysql数据库容器&#xff0c;实现数据库主从复制功能&#xff0c;三个数据库容器分别为主库mysql-master:3307&#xff0c;从库mysql-slave-01:3308&#xff0c;mysql-slave-02:3309。使用的是mysql5.7版本 1. 拉取mongo镜像 docker pull mysql…

并发编程线程安全性之可见性有序性

可见性 可见性: 就是说一个线程对共享变量的修改&#xff0c;另一个线程能够立刻看到 通俗点说&#xff0c;就是两个线程共享一个变量&#xff0c;无论哪一个线程修改了这个变量&#xff0c;另外一个线程都能够立刻看到上一个线程对这个变量的修改 产生线程安全问题的原因 计…

支付流程的理解

开发指引-JSAPI支付 | 微信支付商户平台文档中心 业务流程图&#xff1a; 首先&#xff0c;从业务流程&#xff0c;当有人问你的时候&#xff0c;反问&#xff1a;公司有没有确认跟支付宝合作还是跟微信合作&#xff0c;看有没有签订协议&#xff0c;有的话&#xff0c;要确认…

C# OpenCvSharp Tracker 目标追踪

目录 效果 项目 代码 下载 C# OpenCvSharp Tracker 目标追踪 效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using OpenCvSharp.Tracking; using System; using System.Drawing; using System.Reflection; using System.Windows.Forms; namespace C…

iconfont的组件化使用方法(SVG)

目录 一、需求描述二、操作步骤1.在iconfont中选择项目需要使用的图标2.在项目中创建iconfont.js3.创建svgIcon组件 一、需求描述 将iconfont图标库选择的图标以SVG的形式引入项目并通过组件化的形式在项目中引用可控制图标的大小和颜色 二、操作步骤 1.在iconfont中选择项目…

【论文笔记之 YIN】YIN, a fundamental frequency estimator for speech and music

本文对 Alain de Cheveigne 等人于 2002 年在 The Journal of the Acoustical Society of America 上发表的论文进行简单地翻译。如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 论文链接&#xff1a;http://audition.ens.fr/adc/pdf/2002_…

单片机精进之路-5矩阵键盘扫描

如下图&#xff0c;先在p3口输出0xfe&#xff0c;再读取p3口的电平&#xff0c;如果没有按键按下&#xff0c;temp & 0xf0还是0xf0&#xff0c;如果又第一个键按下&#xff0c;temp & 0xf0还是0xee&#xff0c;其他按键由此类推可得。 //4*4键盘检测程序,按下键后相应…

【笔记】【电子科大 离散数学】 2.命题

文章目录 数理逻辑定义 命题定义不是命题的例子 原子命题和复合命题定义约定 命题联结词否定联结词定义例子真值表 合取联结词定义例子真值表 析取联结词定义例子 蕴含联结词定义例子真值表 等价联结词定义例子真值表 命题符号化及其应用速查表格优先级复合命题符号化布尔检索演…

golang学习1,dea的golang-1.22.0

参考&#xff1a;使用IDEA配置GO的开发环境备忘录-CSDN博客 1.下载All releases - The Go Programming Language (google.cn) 2.直接next 3.window环境变量配置 4.idea的go插件安装 5.新建go项目找不到jdk解决 https://blog.csdn.net/ouyang111222/article/details/1361657…

docker存储驱动

目录 一、写时复制和用时分配 二、联合文件系统 2.1、aufs ​编辑 2.2、分层的问题 2.3、overlay 2.4 文件系统区别 三、容器跑httpd案例 3.1、案例1&#xff1a;端口映射 3.2、案例2&#xff1a;制作httpd应用镜像 3.3、案例3&#xff1a;docker数据卷挂载 3.4、案…

sqllabs的order by注入

当我们在打开sqli-labs的46关发现其实是个表格&#xff0c;当测试sort等于123时&#xff0c;会根据列数的不同来进行排序 我们需要利用这个点来判断是否存在注入漏洞&#xff0c;通过加入asc 和desc判断页面有注入点 1、基于使用if语句盲注 如果我们配合if函数&#xff0c;表达…

《Docker 简易速速上手小册》第4章 Docker 容器管理(2024 最新版)

文章目录 4.1 容器生命周期管理4.1.1 重点基础知识4.1.2 重点案例&#xff1a;启动并管理 Python Flask 应用容器4.1.3 拓展案例 1&#xff1a;调试运行中的容器4.1.4 拓展案例 2&#xff1a;优雅地停止和清理容器 4.2 容器数据管理与持久化4.2.1 重点基础知识4.2.2 重点案例&a…

IT行业风向让人琢磨不透,一端狂裁,一端狂吸收……

2024年伊始&#xff0c;全球科技行业显然又掀起了新一波的裁员潮。尽管这轮裁员潮来得不如去年年初那样猛烈&#xff0c;但依然不免令不少人感到措手不及…… 甚至有人开工第一天收到的并不是开门红包&#xff0c;而是裁员说明书&#xff1a; 以前一直以为年前被裁&#xff0c;…

甲基二十四聚乙二醇叠氮,mPEG24 N3,可以和含有 Alkyne 基团的分子反应

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;2563873-82-3&#xff0c;m-PEG24-azide&#xff0c;mPEG24 N3&#xff0c;甲基二十四聚乙二醇叠氮&#xff0c;甲基 PEG24 叠氮 一、基本信息 【产品简介】&#xff1a;M-PEG24-azide is a click chemical reagent…

idea集成git(实用篇)

0.Git常用命令 Git常用命令-CSDN博客 1.下载git Git - Downloads 一路傻瓜式安装即可&#xff08;NEXT&#xff09; 2.软件测试 在Windows桌面空白处&#xff0c;点击鼠标右键&#xff0c;弹出右键菜单 Git软件安装后&#xff0c;会在右键菜单中增加两个菜单 Git GUI He…

2024022502-数据库绪论

数据库绪论 数据管理的三个阶段 人工管理阶段 文件系统阶段 数据库系统阶段 基本术语 数据&#xff08;Data&#xff09; 计算机用来描述事物的记录&#xff08;文字&#xff0e;图形&#xff0e;图像&#xff0e;声音&#xff09;数据的形式本身并不能完全表达其内容&am…

LeetCode第二题: 两数相加

文章目录 题目描述示例 解题思路 - 迭代法Go语言实现 - 迭代法算法分析 解题思路 - 模拟法Go语言实现 - 模拟法算法分析 解题思路 - 优化模拟法主要方法其他方法的考虑 ‍ 题目描述 给出两个非空的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照逆序的方…

第三百六十八回

文章目录 1. 概念介绍2. 方法与细节2.1 获取方法2.2 使用细节 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取当前系统语言"相关的内容&#xff0c;本章回中将介绍如何获取时间戳.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

alembic

alembic是sqlalchemy的作者开发的。 用来做OMR模型与数据库的迁移与映射。 第一个&#xff0c;alembic的所有命令都是以alembic开头 第二&#xff0c;alembic的迁移文件也是通过版本进行控制的。首先&#xff0c;通过pip install alembic进行安装。以下将解释alembic的用法 方…

Linux内核网络

文章目录 前言网络协议栈图解功能 发送Linux内核网络数据包图解流程 接收Linux内核网络数据包图解流程 最后 前言 你好&#xff0c;我是醉墨居士&#xff0c;因为Linux内核涉及的内容极多&#xff0c;我们初学者如果一上来就开始深挖细节&#xff0c;很有可能会在Linux内核代码…