常见算法面试题目
前言
总结一些常见的算法题目,每一个题目写一行思路,方便大家复习。具体题目的来源是下面的网站。
剑指offer
剑指offe2
leetcode200题
leetcode 100题
leetcode150题
leetcode 75题
文章目录
- 前言
- 二叉树非递归遍历
- 牛客
- JZ31 栈的压入、弹出序列 (8/4)
- JZ4 二维数组中的查找
- JZ11 旋转数组中的最小数字
- JZ44数字序列中某一位的数字
- JZ42 连续子数组的最大和
- leetcode 100题思路整理
- 前10题
- 10-19题
- 20-29题
- 30-39题
- 40-50 题
- leetcode 150题
- 数组/字符串
- 双指针/滑动窗口
- 矩阵
- 30-40题
- 牛客
- 动态规划
- 回溯
- 0-1背包
二叉树非递归遍历
前序遍历方法一
- 直接右边放入栈,然后左边放入栈。
public List<Integer> preorderTraversal(TreeNode root) {List<Integer>ans = new ArrayList<>();if (root == null) return ans;Stack<TreeNode>st = new Stack<>();st.add(root);while (!st.empty()) {TreeNode node = st.pop();ans.add(node.val);if (node.right != null) st.add(node.right);if (node.left != null) st.add(node.left);}return ans;}
// 方法二
public List<Integer> preorderTraversal(TreeNode root) {List<Integer>ans = new ArrayList<>();Stack<TreeNode>st = new Stack<>();TreeNode node = root;while (node != null || !st.empty()) {while (node != null) {ans.add(node.val);st.add(node);node = node.left;}node = st.pop();node = node.right;}return ans;
中序遍历
- 首先把root放进去
- 尽可能往左走,并且入栈
- 出栈,统计结果,往右走
public List<Integer> inorderTraversal(TreeNode root) {List<Integer>ans = new ArrayList<>();Stack<TreeNode>st = new Stack<>();while (root != null || !st.empty()) {while (root != null) {st.add(root);root = root.left;}root = st.pop();ans.add(root.val);root = root.right;}return ans;}
后续遍历
- 增加pre,防止再重新入栈
- 首先把root放进去
- 尽可能往左走,并且入栈
- 出栈,如果右边没有了或者右边已经遍历过了:输出,更新pre,root置空
- 否则,右边入栈。
class Solution {public List<Integer> postorderTraversal(TreeNode root) {List<Integer>ans = new ArrayList<>();Stack<TreeNode>st = new Stack<>();TreeNode pre = null;while (root != null || !st.empty()) {while (root != null) {st.add(root);root = root.left;}root = st.pop();if (root.right == null || root.right == pre) {ans.add(root.val);pre = root;root = null;} else {st.add(root);root = root.right;}}return ans;}
}
牛客
JZ31 栈的压入、弹出序列 (8/4)
【2,1,0】【1,2,0】是true,但是如果使用if进行出栈,就会成false。
每次只要栈不空,并且栈顶和当前的pop一致,就应该直接出栈。
- 先出栈
- 后入栈
- 最后除了循环再判断
JZ4 二维数组中的查找
- 左上角开始
JZ11 旋转数组中的最小数字
- 如果相等,最小的一定可以是m,所以r一定可以进行缩小。
- 需要和r进行比较
这个可以由以下三种情况总结出来
- 如果逆序:前面的都小于,所以l一直加
- 如果顺序: 没有大于nums[n - 1]的,所以r一直减。
- 如果前顺,后顺
前面的最小值,大于nums[n - 1]。所以当大于,l加,当小于r减。
综合上面三种情况,可以使用二分查找。
- 当大于的时候l加
- 当小于的时候l减。
然后等于的时候
- 如果是r, m在[l, r - 1]中
- 如果不是r, 那么r就可以直接向前移动一个。因为r排除了。
JZ44数字序列中某一位的数字
- 首先判断是几位数字
- 然后计算是第几个数字 (n - 1) /digit
- 最后计算第几位 (n - 1) % digit
JZ42 连续子数组的最大和
- ans = INT_MIN
- s = 0, minv = 0;// 这两个是对应给sun[0]的值。
- 先更新ans,再更新minv
leetcode 100题思路整理
前10题
-
两数之和:
-
使用hash,需要保证两者下标不相同。使用排序处理唯一的就很简单
-
如果需要寻找多个,那么hash还是会简单。边存,边处理。
-
排序寻找多个的情况下,相等一定出现在中间,但是不一定就一组。所以while之后,不能break,而是i++, j–继续寻找下一组相等的。
-
-
两数相加:链表中创建新结点,需要使用p,并且p需要每次移动。如果创建新结点就不用了
-
无重复字符的最长子串:双指针,java使用int[]数组更快
-
最长回文子串
-
正则表达式匹配:*的时候,小优化,类似于完全背包问题的优化,可以考虑直接使用dfs进行求解。只有当j不变的时候,匹配多个。
- j - 1, i - 1表示当前字符
- i= 0的时候s是空串
-
盛水最多的容器:经典双指针。
-
三数之和。排序、保证数字相等的时候continue就行了。
10-19题
- 电话号码的字母组合:简单dfs,使用string保存映射
- 删除链表倒数第N个结点。从nhead向前走N + 1个,然后删除下一个结点
- 有效的阔号组合:简单stack应用
- 合并两个有序链表,p,并且p不断移动。就算最后 = null的时候也需要移动
- 括号生成:简单dfs。使用curl或者sum进行flag标志
- 合并k个升序列表:Priority_Queue的排序函数重写。如果放入队列的为空指针,会报错。
- 下一个排列: Arrays.sort(nums, j + 1, n), 第一个比这个数字大的数字
- 找到第一个可以增大的位数
- 找到大于他的最小的数字
- 从它后一位往后进行排序,这样就是最小的了。
- 数字序列中某一位数字:第k位开始数字start, 第k位数字个数sum。
n / k
,n % k
就是对应的数字和对应的位数 - 最长有效阔号:不会空间优化。stack +dp进行解决。stack中存储下标。f:表示以i结尾的最大的值。 ans = max(f[i])
- 搜索旋转排序数组:直接和nums[0]进行比较,小于一定是右边的。
20-29题
- 排序数组中查找元素的第一个和最后一个位置-lower_bound,upper_bound
- 组合总数-dfs, 从本层的最后一个数字开始,也就是从i开始
- 接雨水:ans += 左右最大的最小的-cur
- 全排列-简单dfs
- 旋转图像-矩形,所以旋转是(n / 2), (n + 1) / 2就行了。另外对应关系是行变列,列变行。然后数量关系是n - j - 1,另一个是i。或者两另一个是n - i - 1, 另一个是j。试一下就行了。
- 字母异位词分组:使用cnt进行计数,使用toString()转换成字符串
- 最大子数组和:求前缀和的最小值。更新的时候sum、ans, minv依次更新就行了
- 跳跃游戏:空间优化cur,就行了
- 合并区间:当前区间的第二维,应该是ans.get[ans.size() - 1]第二维和当前区间第二维的最大值。
- 不同路径:初始化f(0, 0) = 1, 然后让f(i, j) += f(i - 1, j) + f(i, j - 1);
30-39题
- 最小路径和:摘樱桃
- 爬楼梯:斐波那契
- 编辑距离:直接dfs做就行了。参照正则表达式匹配
- 颜色分类:快慢双指针。i永远指向第一个不为0的,j找到下一个为0的,与他交换
- 最小覆盖子串:滑动窗口,满足贪心的双指针,如果窗口中没有,就没有必要继续了。
- 子集:二进制枚举
- 单词搜索:
- 柱状图中最大矩形:单调栈,找左右小于它的第一个坐标,然后就可以求宽度了。
- 最大矩形:前缀和 + 单调栈
- 二叉树的中序遍历:简单
40-50 题
- 不同二叉搜索树
leetcode 150题
数组/字符串
- 合并两个有序数组
- 删除有序数组的重复项II。(nums[i] != nums[j - 1] || nums[i] != nums[j - 2])swap(nums[j++], nums[i])
- 轮转数组(整体轮转,[0, k), [k, n))
- O(1) 时间插入、删除和获取随机元素: map保存下标,删除最后一个元素
- 左右文本对齐
双指针/滑动窗口
- 子串。子数组。
- 最小覆盖子串
- h指数
- 串联所有单词的子串
矩阵
- 矩阵置0,但标志法,逆序处理每一行。最后一行可以直接进行处理。
- 矩阵旋转:上下,然后主对角线。注意i,j的取值范围。
- 螺旋矩阵:最简的办法,就是直接改变当前的矩阵。但是可能会给别的函数造成问题。+ 101,然后减去101就行了。
- 生命游戏:当前矩阵进行编码,进行转换
- 数读游戏:可以三个矩阵 + hash运算进行判断。然后可以使用Space数组保存空格,然后把空格进行填充,使用bool dfs就行了。
30-40题
牛客
动态规划
- 跳台阶扩展:最后一步可以跳1,2…i- 1。不能最后一步不跳,所以是1~n,最少跳一步。
- 矩形覆盖:类似兔子月。f[0] = 0, f[1] = 1, f[2] = 2; 注意n <= 1的情况。让f开大一点
- 礼物最大价值:直接简单dp。
- 把数字翻译成字符串:特殊情况“10”, “100”。
- 如果当前为0,不能加上f[i - 1]
- 如果前面为0,或者组成数字大于26,不能加上f[i - 2]
回溯
-
矩阵的路径:
- 字符相同的时候才能继续向下寻找。
- 回溯,需要让vis变成0。
-
JZ13 机器人的运动范围
- 思路出错,应该是直接从(0, 0)dfs,结果想成了遍历整个矩阵了。
- 正确的思路应该是从(0, 0)开始dfs或者bfs。
0-1背包
- 2787. 将一个数字表示成幂的和的方案数:n
相关文章:
常见算法面试题目
前言 总结一些常见的算法题目,每一个题目写一行思路,方便大家复习。具体题目的来源是下面的网站。 剑指offer 剑指offe2 leetcode200题 leetcode 100题 leetcode150题 leetcode 75题 文章目录 前言二叉树非递归遍历牛客JZ31 栈的压入、弹出序列 (…...

PiflowX组件-JDBCWrite
JDBCWrite组件 组件说明 使用JDBC驱动向任意类型的关系型数据库写入数据。 计算引擎 flink 有界性 Sink: Batch Sink: Streaming Append & Upsert Mode 组件分组 Jdbc 端口 Inport:默认端口 outport:默认端口 组件属性 名称展示名称默…...

算法导论复习题目
这题需要考虑什么呢? 一换元,二要使用主方法猜出结果,三是证明的时候添加一个低阶项来消除 LC检索 C(x)是从上帝视角来看的成本 对C(x)的一个估计: 由两个部分组成,就相当于由以往的经验对未来…...

HTTPS协议详解
目录 前言 一、HTTPS协议 1、加密是什么 2、为什么要加密 二、常见加密方式 1、对称加密 2、非对称加密 三、数据摘要与数据指纹 1、数据摘要 2、数据指纹 四、HTTPS加密策略探究 1、只使用对称加密 2、只使用非对称加密 3、双方都使用非对称加密 4、对称加密非…...
菜鸟学习vue3笔记-vue3 router回顾
1、路由router pnpm i vue-router2、创建使用环境 1.src下创建 router文件夹、里面创建index.ts文件 //创建一个路由暴露出去//1.引入createRouter import { createRouter, createWebHistory } from "vue-router";// import Home from ../components/Home.vue//…...

Mybatis枚举类型处理和类型处理器
专栏精选 引入Mybatis Mybatis的快速入门 Mybatis的增删改查扩展功能说明 mapper映射的参数和结果 Mybatis复杂类型的结果映射 Mybatis基于注解的结果映射 Mybatis枚举类型处理和类型处理器 再谈动态SQL Mybatis配置入门 Mybatis行为配置之Ⅰ—缓存 Mybatis行为配置…...

2023 NCTF writeup
CRYPTO Sign 直接给了fx,gx,等于私钥给了,直接套代码,具体可以参考: https://0xffff.one/d/1424 fx [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0…...
golang的大杀器协程goroutine
在Golang中,协程(Goroutine)是轻量级的执行单元,用于实现并发编程。它是Golang语言的重要组成部分,提供了简洁、高效的方式来处理并发任务。 特点: 1)轻量级:Go语言的协程是轻量级…...

[Angular] 笔记 9:list/detail 页面以及@Output
1. Output input 好比重力,向下传递数据,list 传给 detail,smart 组件传给 dumb 组件,父组件传给子组件。input 顾名思义,输入数据给组件。 output 与之相反,好比火箭,向上传递数据或事件。ou…...

Linux学习笔记(一)
如果有自己的物理服务器请先查看这篇文章 文章目录 网卡配置Linux基础指令ls:列出目录内容cd(mkdir.rmkdir): 切换文件夹(创建,删除操作)cp:复制文件或目录mv:文件/文件夹移动cat:查看文件vi:文件查看编辑man:查看命令手册more: 查看文件内容less : 查看文件内容 ps: 显示当前进…...
Python 爬虫 教程
python爬虫框架:Scrapyd,Feapder,Gerapy 参考文章: python爬虫工程师,如何从零开始部署ScrapydFeapderGerapy? - 知乎 神器!五分钟完成大型爬虫项目 - 知乎 爬虫框架-feapder - 知乎 scrap…...

uniapp原生插件 - android原生插件打包流程 ( 避坑指南一)
【彩带- 避坑知识点】: 当时开发中安卓插件打包成功后,uniapp引用插件aar,用云打包 ,总是提示不包含插件。原因是因为module的androidManifest.xml文件没有注册activity。 这一步 很重要,一定要注册。 --------------------------…...

搭建maven私服
maven maven简介 什么是maven? Maven这个单词来自于意第绪语(犹太语),意为知识的积累。 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的项目管理工具软件。 Maven 除了以…...

EST-100身份证社保卡签批屏按捺终端PC版web版本http协议接口文档,支持web网页开发对接使用
<!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width,initial-scale1.0"><title>演示DEMO</title><script type"text/…...
基于SpringBoot的毕业论文管理系统
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的毕业论文管理系统,java…...

iToF人脸识别
iToF(间接飞行时间)是一种测量光飞行时间的技术,主要应用于人脸识别。 iToF人脸识别技术在哪些场景下会用到 iToF人脸识别技术可以应用于许多场景,以下是一些常见的应用场景: 平安城市:在城市监控系统中,iToF人脸识别技术可以用于实时监控、目标检测和识别,以及异常行为…...

Django开发3
Django开发3 Django开发编辑用户9.靓号管理9.1 表结构9.2 靓号列表9.3 新建靓号9.4 编辑靓号9.5 搜索手机号9.6 分页 10.时间插件11.ModelForm和BootStrap操作 各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! Django开发 部门管…...

MS2358:96KHz、24bit 音频 ADC
产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器,适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入,所以不需要外部器 件,非常适…...

【Android12】Android Framework系列---tombstone墓碑生成机制
tombstone墓碑生成机制 Android中程序在运行时会遇到各种各样的问题,相应的就会产生各种异常信号,比如常见的异常信号 Singal 11:Segmentation fault表示无效的地址进行了操作,比如内存越界、空指针调用等。 Android中在进程(主要…...

中间件系列 - Redis入门到实战(原理篇)
前言 学习视频: 黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目 中间件系列 - Redis入门到实战 本内容仅用于个人学习笔记,如有侵扰,联系删除 学习目标 Redis数据结构Redis网…...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

新能源汽车智慧充电桩管理方案:新能源充电桩散热问题及消防安全监管方案
随着新能源汽车的快速普及,充电桩作为核心配套设施,其安全性与可靠性备受关注。然而,在高温、高负荷运行环境下,充电桩的散热问题与消防安全隐患日益凸显,成为制约行业发展的关键瓶颈。 如何通过智慧化管理手段优化散…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...