当前位置: 首页 > news >正文

常见算法面试题目

前言

总结一些常见的算法题目,每一个题目写一行思路,方便大家复习。具体题目的来源是下面的网站。

剑指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指数
  • 串联所有单词的子串

矩阵

  1. 矩阵置0,但标志法,逆序处理每一行。最后一行可以直接进行处理。
  2. 矩阵旋转:上下,然后主对角线。注意i,j的取值范围。
  3. 螺旋矩阵:最简的办法,就是直接改变当前的矩阵。但是可能会给别的函数造成问题。+ 101,然后减去101就行了。
  4. 生命游戏:当前矩阵进行编码,进行转换
  5. 数读游戏:可以三个矩阵 + 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

相关文章:

常见算法面试题目

前言 总结一些常见的算法题目&#xff0c;每一个题目写一行思路&#xff0c;方便大家复习。具体题目的来源是下面的网站。 剑指offer 剑指offe2 leetcode200题 leetcode 100题 leetcode150题 leetcode 75题 文章目录 前言二叉树非递归遍历牛客JZ31 栈的压入、弹出序列 (…...

PiflowX组件-JDBCWrite

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

算法导论复习题目

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

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&#xff0c;等于私钥给了&#xff0c;直接套代码&#xff0c;具体可以参考&#xff1a; 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中&#xff0c;协程&#xff08;Goroutine&#xff09;是轻量级的执行单元&#xff0c;用于实现并发编程。它是Golang语言的重要组成部分&#xff0c;提供了简洁、高效的方式来处理并发任务。 特点&#xff1a; 1&#xff09;轻量级&#xff1a;Go语言的协程是轻量级…...

[Angular] 笔记 9:list/detail 页面以及@Output

1. Output input 好比重力&#xff0c;向下传递数据&#xff0c;list 传给 detail&#xff0c;smart 组件传给 dumb 组件&#xff0c;父组件传给子组件。input 顾名思义&#xff0c;输入数据给组件。 output 与之相反&#xff0c;好比火箭&#xff0c;向上传递数据或事件。ou…...

Linux学习笔记(一)

如果有自己的物理服务器请先查看这篇文章 文章目录 网卡配置Linux基础指令ls:列出目录内容cd(mkdir.rmkdir): 切换文件夹(创建,删除操作)cp:复制文件或目录mv:文件/文件夹移动cat:查看文件vi:文件查看编辑man:查看命令手册more: 查看文件内容less : 查看文件内容 ps: 显示当前进…...

Python 爬虫 教程

python爬虫框架&#xff1a;Scrapyd&#xff0c;Feapder&#xff0c;Gerapy 参考文章&#xff1a; python爬虫工程师&#xff0c;如何从零开始部署ScrapydFeapderGerapy&#xff1f; - 知乎 神器&#xff01;五分钟完成大型爬虫项目 - 知乎 爬虫框架-feapder - 知乎 scrap…...

uniapp原生插件 - android原生插件打包流程 ( 避坑指南一)

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

搭建maven私服

maven maven简介 什么是maven&#xff1f; Maven这个单词来自于意第绪语&#xff08;犹太语&#xff09;&#xff0c;意为知识的积累。 Maven项目对象模型(POM)&#xff0c;可以通过一小段描述信息来管理项目的构建&#xff0c;报告和文档的项目管理工具软件。 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操作 各位小伙伴想要博客相关资料的话关注公众号&#xff1a;chuanyeTry即可领取相关资料&#xff01; Django开发 部门管…...

MS2358:96KHz、24bit 音频 ADC

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

【Android12】Android Framework系列---tombstone墓碑生成机制

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

中间件系列 - Redis入门到实战(原理篇)

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

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...