手撕最常见的算法岗面试题(25道)

手撕代码环节常常是面试官给出题目的口头或文字描述,要求在纸上手写或在txt文档中打字,面试以简单数据结构与算法题为主,考察基本代码功底。

考察频次:链表 > 字符串/哈希 > 二叉树与图 > 栈/队列 > 查找/排序/搜索 > 动态规划 > 计算机视觉 > 其他(数学/贪心/复杂数据结构)

链表:1~5
字符串/哈希:6~9
二叉树与图:10~13
栈/队列:14
查找/排序/搜索:15~17
动态规划:18~19
计算机视觉:20

1.链表判断是否有环(快手、美团、哈啰)

思路:快慢指针

链表是否存在环的问题是经典的快慢指针问题,不会的看这篇。 (如果一个链表存在环,fast走2,slow走1,那么快慢指针必然会相遇)。如果将尾结点的 next 指针指向其他任意一个结点,那么链表就存在了一个环。快慢指针的特性 —— 每轮移动之后两者的距离会加一(通常是fast走2 slow走1;也可以fast走n slow走1;当然还可以先让fast走k步,再让slow和fast都每次走1,这种做法可以实现求倒数第k个链表元素)。下面会继续用该特性解决环的问题。 当一个链表有环时,快慢指针都会陷入环中进行无限次移动,然后变成了追及问题。想象一下在操场跑步的场景,只要一直跑下去,快的总会追上慢的。当两个指针都进入环后,每轮移动使得慢指针到快指针的距离增加一,同时快指针到慢指针的距离也减少一,只要一直移动下去,快指针总会追上慢指针。
在这里插入图片描述

	bool hasCycle(ListNode *head) {ListNode* fast=head,* slow=head;while(fast!=NULL){fast = fast->next;if(fast!=NULL) fast = fast->next;  //如果fast没结束就再走第2步else return false;  //如果fast结束了就无循环slow = slow->next;if(slow==fast) return true;  //如果fast追上slow就有循环}return false;  //如果fast结束了就无循环}

2. 链表中倒数第k个结点

3. 反转链表/链表的某区间(猿辅导、美团)

思路:栈反转链表/递归双指针

栈反转链表:链表的反转是老生常谈的一个问题了,同时也是面试中常考的一道题。最简单的一种方式就是使用栈,因为栈是先进后出的。实现原理就是把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表。
在这里插入图片描述

ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr) {return head; // 处理空链表或者只有一个节点的情况}stack<ListNode*> stk;ListNode* curr = head;while (curr != nullptr) {  //节点入栈stk.push(curr);curr = curr->next;}ListNode* newHead = stk.top();stk.pop();curr = newHead;while (!stk.empty()) {  //节点出栈curr->next = stk.top();stk.pop();curr = curr->next;}curr->next = nullptr; // 将链表结尾的next指针置为nullptrreturn newHead; // 返回反转后的头节点}

双指针:考虑遍历链表,并在访问各节点时修改 next 引用指向,不断遍历旧链表的每个节点cur,将其指向新链表头new_headnew_head->next=nullptr),其中为了能在赋值后找到cur的写一个节点,用临时节点 t 保存cur->next

ListNode* reverseList(ListNode* head) {if (head == nullptr || head->next == nullptr) {return head; // 处理空链表或者只有一个节点的情况}ListNode* new_head=nullptr;ListNode* cur=head;while(cur!=nullptr){ListNode* t = cur->next;cur->next=new_head;new_head = cur;;cur=t;}return new_head; // 返回反转后的头节点}

4. 合并两个有序链表

思路:双指针,选两个指针中最小的元素插入新链表尾,如果两着有一个先结束,直接把另一个链表剩余部分,接到新链表尾。

ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {if (l1 == nullptr) return l2;if (l2 == nullptr) return l1;ListNode* p1=l1,* p2=l2;ListNode* new_list,* new_head;//新链表头new_head、新链表尾new_listif(p1->val <= p2->val) {new_list=p1; p1=p1->next;}else {new_list=p2; p2=p2->next;}new_head=new_list;while(p1!=NULL && p2!=NULL){//如果l1和l2都有元素,选最小的元素插入新链表if(p1->val <= p2->val) {new_list->next=p1; p1=p1->next;}else {new_list->next=p2; p2=p2->next;}   new_list=new_list->next;         }if(p1!=NULL)//如果l2已经没元素,将l1后面的链表接在新链表尾上new_list->next=p1;else if(p2!=NULL)//如果l1已经没元素,将l2后面的链表接在新链表尾上new_list->next=p2;return new_head;}

5. 链表排序(然后不能动指针)

6. 判断回文字符串

7. 最长回文子串

思路:贪心算法

8. 两个字符串的最大连续公共子串

dp 注意不是非连续

9. 最长不重复子串

leetcode(3)/剑指offer第二版(48)

10. 二叉树遍历

思路:递归
在这里插入图片描述

前序遍历(根左右):从二叉树的根结点出发,当第一次到达结点时就输出结点数据,按照先向左再向右的方向访问。对于上图,遍历顺序如下:ABDHIEJCFG

void preorder(Tnode* T){if(T==NULL)return;else{cout<<T->data;pre_travse(T->lchild);pre_travse(T->rchild);}
}

中序遍历(左根右):从二叉树的根结点出发,当第二次到达结点时就输出结点数据,按照先向左再向右的方向访问。对于上图,遍历顺序如下:HDIBJEAFCG

void midorder(Tnode* T){if(T==NULL)return;else{post_travse(T->lchild);cout<<T->data;post_travse(T->rchild);}

后序遍历(左右根):从二叉树的根结点出发,当第三次到达结点时就输出结点数据,按照先向左再向右的方向访问。对于上图,遍历顺序如下:HIDJEBFGCA

void postorder(Tnode* T){if(T==NULL)return;else{post_travse(T->lchild);post_travse(T->rchild);cout<<T->data;}

11. 二叉树最近公共祖先

思路:遍历

12. 二叉树深度及最长路径

13. 有序链表转换二叉搜索树(快手)

14. 两个栈实现队列(字节)

15. 二分查找(阿里巴巴)

16. 排序(快排、归并、堆排)

知道哪些排序算法,快排时间复杂度,时间复杂度推导,O(n)的排序方法

时间复杂度O(n)的排序算法

快排,归并,堆排序

17. DFS/BFS

18. 爬楼梯

剑指offer(八)

19. 扎气球/活动选择问题/会议室选择问题/时间安排问题

https://blog.csdn.net/yysave/article/details/84403875

20. 实现IoU和NMS

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

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

相关文章

金融供应链智能合约 -- 智能合约实例

前提 Ownable:监管者合约,有一个函数能转让监管者。 SupplyChainFin:供应链金融合约,银行、公司信息上链&#xff0c;公司和银行之间的转账。 发票&#xff1a;记录者交易双方和交易金额等的一种记录数据。如:我在超市买了一瓶水,超市给我开了一张发票。 Ownable // SPDX-…

基于java理发店预约系统微信小程序设计与实现

摘要 多姿多彩的世界带来了美好的生活&#xff0c;行业的发展也是形形色色的离不开技术的发展。作为时代进步的发展方面&#xff0c;信息技术至始至终都是成就行业发展的重要秘密。不论何种行业&#xff0c;大到国家、企业&#xff0c;小到团体、个人都在多方位的结合信息化技术…

【C++】unordered_map在Windows和Linux上的不同行为

我目前手头上的项目&#xff0c;需要编译在板端Linux上运行&#xff0c;但是日常daily调试多在Windows上开发。这就涉及到同一份代码在多平台上的编译个运行。有一次遇到了一个奇怪的现象&#xff1a;跑同样的一份代码&#xff0c;Windows和Linux出来的结果是不一致的。最终确定…

spring security + oauth2 使用RedisTokenStore 以json格式存储

1.项目架构 2.自己对 TokenStore 的 redis实现 package com.enterprise.auth.config;import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis…

深度学习入门必读 | 深度学习算法技术原理和发展

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。随着人工智能技术的发展&#xff0c;深度学习已经成为了一个热门话题。为了让大家能够更清晰直观的了解深度学习&#xff0c;今天这篇文章就重点给大家介绍一下深度学习算法的技术原理和发展&#xff01;&#x1f308; 目录…

fishing之第一篇邮件的基础知识

文章目录 一、传统钓鱼方式0x01 介绍0x02 社工方式0x03 传统钓鱼方式:0x04 常见的钓鱼方式最简单的邮件头伪造利用文件名反转(RLO)自解压自解压+RLO二、企业对钓鱼的防护邮件网关三、现今钓鱼演变0x01 鱼叉网络钓鱼0x02 水坑攻击0x03 U盘钓鱼0x04 信息收集常见信息包括常见可获…

Python中的PDF文本提取:使用fitz和wxPython库(带进度条)

引言&#xff1a; 处理大量PDF文档的文本提取任务可能是一项繁琐的工作。本文将介绍一个使用Python编写的工具&#xff0c;可通过简单的操作一键提取大量PDF文档中的文本内容&#xff0c;极大地提高工作效率。 import wx import pathlib import fitzclass PDFExtractor(wx.Fr…

自动化测试po模式是什么

一、什么是PO模式 全称&#xff1a;page object model 简称&#xff1a;POM/PO PO模式最核心的思想是分层&#xff0c;实现松耦合&#xff01;实现脚本重复使用&#xff0c;实现脚本易维护性&#xff01; 主要分三层&#xff1a; 1.基础层BasePage&#xff1a;封装一些最基…

Kubernetes(K8s)从入门到精通系列之十四:安装工具

Kubernetes K8s从入门到精通系列之十四&#xff1a;安装工具 一、kubectl二、kind三、minikube四、kubeadm 一、kubectl Kubernetes 命令行工具 kubectl&#xff0c; 让你可以对 Kubernetes 集群运行命令。 你可以使用 kubectl 来部署应用、监测和管理集群资源以及查看日志。 …

使用Barnes-Hut算法在C语言中进行重力模拟

在物理学中,重力模拟是一个重要的研究领域,它涉及到模拟天体之间的重力相互作用。在计算机科学中,我们可以使用各种算法来模拟这种现象。其中,Barnes-Hut算法是一种广泛使用的方法,它是一种近似的N体模拟方法,可以在O(N log N)的时间复杂度内完成计算,比直接的O(N^2)方法…

LVS负载均衡(DR)

文章目录 LVS-DR模式配置原理注DR配置添加VIP下载ipvsadm在DR上管理LVS Real-Server RS配置绑定VIP到环回网卡添加访问VIP的路由配置ARP抑制测试&#xff1a; LVS-DR模式配置 原理 当客户端发起请求后由DR处理&#xff0c;通过算法将流量转发至Real-Server中的某一个处理。然后…

HDFS介绍

目录 ​编辑 一、HDFS基础 1.1 概述 1.2 HDFS的设计目标 1.2.1 硬件故障 1.2.2 流式数据访问 1.2.3 超大数据集 1.2.4 简单的一致性模型 1.2.5 移动计算而不是移动数据 1.2.6 跨异构硬件和软件平台的可移植性 1.3 基础概念 1.3.1 块&#xff08;Block&#xff09; 1.3.2 复制…

Rust中的derive属性详解

1. Rust中的derive是什么&#xff1f; 在Rust语言中&#xff0c;derive是一个属性&#xff0c;它可以让编译器为一些特性提供基本的实现。这些特性仍然可以手动实现&#xff0c;以获得更复杂的行为。 2. derive的出现解决了什么问题&#xff1f; derive属性的出现解决了手动…

java框架整合Springmvc+···+maven

框架整合: Springmvc Mybatis Shiro&#xff08;权限&#xff09; REST(服务) WebService(服务) JMS(消息) Lucene(搜搜引擎) Quartz(定时调度) Bootstrap Html5&#xff08;支持PC、IOS、Android&#xff09; 系统模块&#xff1a; 1. 用户管理&#xff1a; 用户信…

【MySQL】检索数据使用数据处理函数

函数 与其他大多数计算机语言一样&#xff0c;SQL支持利用函数来处理数据。函数一般是在数据上执行的&#xff0c;它给数据的转换和处理提供了方便。 函数没有SQL的可移植性强&#xff1a;能运行在多个系统上的代码称为可移植的。多数SQL语句是可移植的&#xff0c;而函数的可…

虹科案例 | PLC如何应用于建筑的3D打印?

客户&#xff1a;Rebuild 合作伙伴&#xff1a;ASTOR 应用&#xff1a;用于建筑的大尺寸3D打印 应用产品&#xff1a;3D混凝土打印机 &#xff08;一&#xff09;应用背景 自从20世纪80年代以来&#xff0c;增材制造技术&#xff08;即3D打印&#xff09;不断发展。大部分3D打印…

ArduPilot开源代码之Companion Computers简单分析

ArduPilot开源代码之Companion Computers简单分析 1. 源由2. 伴机系统2.1 APSync2.2 DroneKit2.3 FlytOS2.4 Maverick2.5 ROS2.6 Rpanion-server 3. 总结4. 参考资料 1. 源由 从稳定性&#xff0c;社区群体&#xff0c;以及开源方式的角度看&#xff0c;Ardupilot是不错的选择…

HttpRunner自动化测试工具之录制工具使用--使用抓包工具通过命令转成yml文件

录制工具使用&#xff1a; 为了简化测试用例的编写工作&#xff0c;HttpRunner实现了测试用例生成的功能&#xff0c;对应的转换工具为一个独立的项目&#xff1a;har2case 使用操作步骤&#xff1a; 1、通过抓包工具获取HAR格式的数据包 2、通过命令har2case har的数据包路径…

Mybatis:一对一查询映射处理

Mybatis&#xff1a;一对一查询映射处理 前言一、概述二、创建数据模型三、 问题四、解决方案1、方案一&#xff1a;级联方式处理映射关系2、方案二&#xff1a;使用association处理映射关系3、方案三&#xff1a;分步查询 前言 本博主将用CSDN记录软件开发求学之路上亲身所得…

40.利用欧拉法求解微分方程组(matlab程序)

1.简述 求解微分方程的时候&#xff0c;如果不能将求出结果的表达式&#xff0c;则可以对利用数值积分对微分方程求解&#xff0c;获取数值解。欧拉方法是最简单的一种数值解法。前面介绍过MATLAB实例讲解欧拉法求解微分方程&#xff0c;今天实例讲解欧拉法求解一阶微分方程组。…