手撕最常见的算法岗面试题(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,一经查实,立即删除!

相关文章

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; 目录…

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;封装一些最基…

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 复制…

【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的数据包路径…

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

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

车载软件架构 —— 闲聊几句AUTOSAR OS(十一)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他人的角度来反对自己。人生在世,最怕的就是把别人的眼光当成自己生活的唯一标…

TBB库中实现协程(coroutine)的源码说明

源码请见: https://github.com/oneapi-src/oneTBB/blob/master/src/tbb/co_context.h 在windows系统&#xff0c;TBB(也就是intel 的 oneTBB库)&#xff0c;通过windwos fiber(纤程)来实现协程(coroutine)。 创建一个协程,代码很简洁: inline void create_coroutine(corouti…

C++动态规划经典试题解析之打家劫舍系列

1.前言 力扣上有几道与打家劫舍相关的题目,算是学习动态规划时常被提及的经典试题,很有代表性,常在因内大大小小的社区内看到众人对此类问题的讨论。 学习最好的方式便是归纳总结、借鉴消化,基于这个目的,本文对此类问题也做了讲解,在一些优秀思想的基础上添加了个人观…

react中PureComponent的理解与使用

一、作用 它是一个纯组件&#xff0c;会做一个数据的浅比较&#xff0c;当props和state没改变的时候&#xff0c;不会render重新渲染&#xff0c; 改变后才会render重新渲染&#xff0c;提高性能。 二、使用 三、注意 它不能和shouldComponentUpdate生命周期同时使用。因为它…

【CSS】3D卡片效果

效果 index.html <!DOCTYPE html> <html><head><title> Document </title><link type"text/css" rel"styleSheet" href"index.css" /></head><body><div class"card"><img…

【JAVA】继承

作者主页&#xff1a;paper jie的博客 本文作者&#xff1a;大家好&#xff0c;我是paper jie&#xff0c;感谢你阅读本文&#xff0c;欢迎一建三连哦。 本文录入于《JAVASE语法系列》专栏&#xff0c;本专栏是针对于大学生&#xff0c;编程小白精心打造的。笔者用重金(时间和精…

HDFS集群滚动升级以及回滚相关

HDFS集群滚动升级以及回滚相关 介绍不停机滚动升级非联邦HA集群联邦HA集群 停机升级--非HA集群HDFS集群降级和回滚异同点共同点不同点 HA集群降级&#xff08;downgrade&#xff09;注意事项 集群回滚操作 介绍 在hadoop v2中&#xff0c;HDFS支持namenode高可用&#xff08;H…

如何将 dubbo filter 拦截器原理运用到日志拦截器中?

业务背景 我们希望可以在使用日志拦截器时&#xff0c;定义属于自己的拦截器方法。 实现的方式有很多种&#xff0c;我们分别来看一下。 拓展阅读 java 注解结合 spring aop 实现自动输出日志 java 注解结合 spring aop 实现日志traceId唯一标识 java 注解结合 spring ao…

思科单臂路由、lacp链路聚合、NAT实验

实验拓扑图&#xff1a; 实验目的&#xff1a; 如图所示配置相应IP地址和VLAN&#xff0c;并通过在AR1上配置单臂路由&#xff0c;实现VLAN10和VLAN20的主机能够在VLAN间通信&#xff1b;在SW1和SW2的三条链路实施链路聚合&#xff0c;使用静态LACP模式&#xff0c;使一条链…