常见算法面试题目
前言
总结一些常见的算法题目,每一个题目写一行思路,方便大家复习。具体题目的来源是下面的网站。
剑指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网…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...

python执行测试用例,allure报乱码且未成功生成报告
allure执行测试用例时显示乱码:‘allure’ �����ڲ����ⲿ���Ҳ���ǿ�&am…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...