数据结构和算法面试常见题必考以及前端面试题
1.数据结构和算法
1.1 反转单向链表
public class Node {public int value;public Node next;
}public Node reverseList(Node head) {Node pre = null;Node next = null;while (head != null) {next = head.next;head.next = pre;pre = head;head = head.next}return pre;
}
1.2 在顺序表中插入和删除一个结点平均移动多少个结点?
在等概率的情况下,顺序表插入一个结点需要平均移动n/2个结点。删除一个结点需要平均移动(n-1)/2个结点。具体的移动次数取决于长度n和位置i,两者越近,移动的越少。
1.3 如何以递归和非递归方式实现二分查找
非递归:
private int binarySearch(int[] arr, int searchKey) {if (arr == null) {return -1;}int n = arr.length;int left = 0;int right = n - 1;while (left <= right) {int mid = left + ((right -left) >> 1);if (arr[mid] > searchKey) {right = mid - 1;} else if (arr[mid] < searchKey) {left = mid + 1;} else {return mid;}}return -1;
}
递归:
private int binarySearchRecursive(int[] arr, int left, int right) {if (arr == null) {return -1;}int n = arr.length;int left = 0;int right = n -1;while (left <= right) {int mid = left + ((right - left) >> 1);if (arr[mid] > searchKey) {binarySearchRecursive(arr, left, mid - 1);} else if (arr[mid] < searchKey) {binarySearchRecursive(arr, mid + 1, right);} else {return mid;}}return -1;
}
需要注意的是,二分查找算法的时间复杂度为O(logn),最坏情况下的时间复杂度为O(logn)
1.4 求二叉树的深度
private int getDepth(Node node) {if (node == null) {return 0;}int left = getDepth(node.left);int right = getDepth(node.right);return left > right ? (left + 1) : (right + 1);
}
1.5 如何在排序的数组中,找出给定数字出现的次数
其实我的想法是通过hashmap来实现,其实也没必要在乎数组是否是排序的。时间复杂度方面,遍历整个数组,将数组元素添加到hash中,最后再查询,时间复杂度应该是O(n).
function getTimes(arr, key) {var n = arr.length;var hash = {};for (var i = 0; i < n; i ++) {var ele = arr[i];if (!hash[ele]) {hash[ele] = 1;} else {hash[ele] ++;}}if (hash[key]) {return hash[key]; } else {return -1;}
}
private static void stasTimes(int[] arr, int key) {int len = arr.length;HashMap<Integer, Integer> hash = new HashMap<Integer, Integer>();for (int i =0; i < len; i++) {if (hash.containsKey(arr[i])) {Integer val = hash.get(arr[i]) + 1;hash.put(arr[i], val);} else {hash.put(arr[i], 1);}}for (Integer hashKey: hash.keySet()) {if (hashKey.intValue() == key) {System.out.println(key + " has appeared " + hash.get(hashKey) + " times");}}}
1.6 如何把字符串中的指定字符移动到字符串的前面
private char[] moveChar(String str, char a) {char[] arr = str.toCharArray();int i = arr.length - 1;while (arr[i] != a) {i --;}for (int j = i - 1; j >= 0; j --) {if (arr[j] != a) {arr[i] = arr[j];arr[j] = a;i --;}}return arr;
}
1.7 排序算法总结
冒泡排序
public static void bubbleSort(int[] arr) {if (arr == null || arr.length == 0) {return;}for (int i = 0; i < arr.length - 1; i++) {for (int j = 0; j < arr.length - 1 - i; j++) {if (arr[j] > arr[j+1]]) {swap(arr, j+1, j);}}}
}
public static void swap(int[] arr, int i, int j) {int temp = arr[i];arr[i] = arr[j];arr[j] = temp;
}
1.8 数组和链表的区别
- 数组必须事先定义固定的长度,链表采用动态分配内存的形式实现。
- 数组从栈中分配空间,自由度小;链表从对中分配内存,自由度大,但管理麻烦。
- 数组中的数据在内存中时顺序存储的,链表是随机存储的。
- 数组便于查询;链表便于插入删除。
1.9 什么排序元素比较次数和数组初始状态无关
选择排序
##1.10 排序算法比较
排序算法 | 平均时间复杂度 | 最好情况 | 最坏情况 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
希尔排序 | O(nlogn) | O(nlog^2n) | O(nlog^2n) | O(1) | 不稳定 |
归并排序 | O(nlog(n)) | O(nlogn) | O(nlogn) | O(n) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(logn) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(1) | 不稳定 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | 稳定 |
桶排序 | O(n+k) | O(n+k) | O(n^2) | O(n+k) | 稳定 |
基数排序 | O(n*k) | O(n*k) | O(n*k) | O(n+k) | 稳定 |
. |
2.面试题
2.1 百度一面
- 如何实现水平垂直居中
- Position 属性的几种区别
- 讲一下盒子模型
- BFC 怎么实现
- 如何实现左右固定,中间自适应的布局
- 用 JS 实现一个柯里化函数
- 用 JS 实现一个栈
- 实现一个 TS 类,如 Partial 、Tick
- JS 任务执行机制
- 给出一段 Promise+setTimeout 的代码,写出输出顺序
- Promise 有哪些方法
- 对 async/await 的理解
- HTTP 请求响应头有哪些
- HTTPS 的是如何进行数据加密的
2.2 字节
- redux 中间件有了解吗
- Hooks 有了解吗
- Canvas 了解吗
- 开发过程中图表组件用的是是什么,看过 Echarts 的源码吗
- 在开发过程中遇到了哪些难点
2.3 小米
一面(技术面)
基本围绕简历聊,印象比较深的有几个问题
- 1.vue 的源码是否看过,说一下比较有收获的几个点
- 2.说一下 css 的三大特性并展开说一下应用场景
- 3.说一下 CSS 七层层叠顺序
- 4.说一下从浏览器输入网址到页面渲染中间发生了什么
- 5.说下你知道的 HTTP 状态码并说出它们的出现场景
二面(技术面)
主要聊项目,技术聊的比较少,说一下印象深的问题
- 1.如何实现一个简单的单点登录
- 2.说一下关系数据库和非关系数据库的区别,并说下使用场景
- 3.说一下关系数据库外键的使用
三面(技术面)
有印象的问题
- 1.手写翻转二叉树
- 2.说下归并排序的思路和应用场景
- 3.说下你知道的设计模式及应用场景
- 4.说一下从浏览器输入网址到页面渲染中间发生了什么
- 5.如何用缓存进行前端优化;说下浏览器缓存、DNS 缓存、nginx 缓存、服务端缓存的区别;强缓存和协商缓存的应用
四面(技术面)
项目经历为主,以及管理方面的问题,技术方面没聊,有印象的问题
- 1.如何确保项目按时交付
- 2.如何安排开发和管理的时间分配
- 3.如何体现项目价值
五面(技术加面)
感觉是专门准备了一些有深度的问题来问,有印象的有
- 1.如何进行前端性能优化
- 2.说说重绘、重排、回流
- 3.如何开启 GPU 加速,GPU 加速的作用是什么
- 4.是否了解浏览器内核相关技术
- 5.说一下 jsbridge 是如何实现的
- 6.说一下 V8 的垃圾回收机制
- 7.说一下 VUE3.0 比 VUE2.0 做了哪些改动
1、关于ES6 Proxy (2019 今日头条)
2、你觉得TypeScript 和 JavaScript有什么区别
- 语言层面
- Javascript 和 TypeScript 都是ECMAScript 的具体实现
- TypeScript 是静态类型,而JavaScript 是动态类型
- TypeScript 扩展了JavaScript 并且完全包容javascript
执行方面 - TS 需要编译
- JS 不需要编译
厂商层面 - Javascript 由Netscape 率先
TypeScript中的 type 和 instance 区别
interface User {name: string,age: number
}insterface SetUser {(name: string, age: number) : void;
}type SetUser = (name: string, age: number) => void;// 都允许扩展// interface extends typetype Name = {name: string;
}instance
- 不同点
// type 不是一个类型,它是类型别名// type 可以声明基本类型别名,联合类型,元祖等类型// 基本类型别名type Name = string// interface 可以 而type不行// interface 能够声明合并
interface User {name: string,age: number
}
interface User {sex: string
}new Error 不会终止成员运行
async / await 如果右边的方法执行出错了该怎么办 (百度一面2020)
- 方式一 使用Promise 的catch 方法捕获异常 不完善
- 方式二 在async 函数中使用try -catch 捕获异常 (推荐)
async function f() {console.log(1)await new Promise((resolve, reject) => {console.log(2)throw new Error('出错了')}).catch(err => {console.log(3)console.log('执行失败了')})console.log(4)
}
// 1234
使用 try-catch 的时候,会把容易引发异常的代码写到try 里面
async function f() {try {// await new Promise((resolve, reject) => {// // throw new Error('出错了')// resolve()// })await new Promise((resolve, reject) => {throw new Error('出错了')})console.log('正常输出')} catch (err) {// 这里用来捕获异常console.log('异常了)}
}
async function Login () {// 接口请求异常, // 用户名错误、密码错误、用户不存在、500// 前提条件: 接口把所有的异常都通过HTTp状态吗来返回// 尤其是在使用axios 请求库的时候, 它会把所有超出200- 300范围的状态码捕获try {catch (err) {}}
}
注意
- try-catch 只能捕获同步异常
- 还有async 中的await Promise异常
- try-catch 不能直接捕获Promise 调用异常
try {const p = new Promise((resolve, reject) => {throw new Error('error')fs.readFile('./login.js', (err, data) => {if (err) {reject(err)} else {resolve(data)}})})// 这样可以捕获到// p.then(data => {// console.log(data)// }).catch (err => {// console.log('手动 调用catch 捕获异常')// })
} catch (err) {console.log('失败了')
}// 没有错误
相关文章:
数据结构和算法面试常见题必考以及前端面试题
1.数据结构和算法 1.1 反转单向链表 public class Node {public int value;public Node next; }public Node reverseList(Node head) {Node pre null;Node next null;while (head ! null) {next head.next;head.next pre;pre head;head head.next}return pre; }1.2 在顺…...

一文解决Python所有报错
前言 Python是一种强大的编程语言,但是它也有一些报错,这些报错可能会让你感到困惑。本文将介绍如何解决Python中的常见报错。 首先,让我们来看看Python中最常见的报错:SyntaxError。这种报错表明你的代码中有语法错误,…...

LeetCode 1237. Find Positive Integer Solution for a Given Equation【双指针,二分,交互】
本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…...

【C语言】结构体进阶
一、结构体 1. 结构体的声明 (1) 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。(2)结构的声明 struct tag {member-list; }variable-list;例如描述一个学生&#x…...
全志T3+FPGA国产核心板——Pango Design Suite的FPGA程序加载固化
本文主要基于紫光同创Pango Design Suite(PDS)开发软件,演示FPGA程序的加载、固化,以及程序编译等方法。适用的开发环境为Windows 7/10 64bit。 测试板卡为全志T3+Logos FPGA核心板,它是一款基于全志科技T3四核ARM Cortex-A7处理器 + 紫光同创Logos PGL25G/PGL50G FPGA设计…...

深度学习之 imgaug (图像增强)学习笔记
深度学习之 imgaug (图像增强)前言1\. 安装和卸载2\. 示例2.1 基本使用2.2 包含常用的变换示例3 Augmenters常用函数3.1 iaa.Sequential()3.2 iaa.someOf()3.3 iaa.OneOf()3.4 iaa.Sometimes()3.5 iaa.WithColorspace()3.6 iaa.WithChannels()3.7 iaa.No…...

mysql字符串等值查询中条件字段值末尾有空格也能查到数据问题
一、事故还原 我们仍然使用学生信息表,但是我们只需要保留两个字段即可: CREATE TABLE student_info (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,name varchar(20) CHARACTER SET utf8 DEFAULT NULL COMMENT 姓名, PRIMARY KEY (id) ) ENGINEIn…...
一个关于事件溯源Event Sourcing的小荔枝,Golang实现
最后更新于2023年3月1日 10:23:13 参考的这个文章:https://martinfowler.com/eaaDev/EventSourcing.html 用C sharp实现的,我改写成Golang了 最简单的例子 func main() {eProc : NewEventProcessor()//refact : Cargo{Name: "Refactoring"}…...

Vue3 组合式函数,实现minxins
截至目前,组合式函数应该是在VUE 3应用程序中组织业务逻辑最佳的方法。它让我们可以把一些小块的通用逻辑进行抽离、复用,使我们的代码更易于编写、阅读和维护。 一. 什么是“组合式函数”? 根据官方文档说明,在 Vue 应用的概念中…...

什么是钉钉消息推送?
我是3y,一年CRUD经验用十年的markdown程序员👨🏻💻常年被誉为职业八股文选手 在前阵子我就已经接入了钉钉的群机器人和工作消息推送,一直没写文章同步到给大家。 像这种接入渠道的工作,虽然我没接入过&…...

利用 NVIDIATAO 和 WeightBias 加速AI开发
利用 NVIDIATAO 和 Weight&Bias 加速AI开发 利用图像分类、对象检测、自动语音识别 (ASR) 和其他形式的 AI 可以推动公司和商业部门内部的大规模转型。 然而,从头开始构建人工智能和深度学习模型是一项艰巨的任务。 构建这些模型的一个共同先决条件是拥有大量高…...
token - 令牌
文章目录token - 令牌学前须知:1,base64 防君子不防小人2,SHA-256 安全散列算法的一种(hash)3,HMAC-SHA2564,RSA256 非对称加密2.1 JWT - json-web-token1,三大组成2,jwt…...

应用模型开发指南上新介绍
Module、HAP、Ability、AbilitySta-ge、Context……您是否曾经被这些搞不懂又绕不开的知识点困扰? 现在,全新的《应用程序包基础知识》及《应用模型开发指南》为您答疑解惑! 这里有您关注的概念解析、原理机制阐述,也有丰富的…...

Dbeaver连接Hive数据库操作指导
背景:由于工作需要,当前分析研究的数据基于Hadoop的Hive数据库中,且Hadoop服务端无权限进行操作且使用安全模式,在研究了Dbeaver、Squirrel和Hue三种连接Hive的工具,在无法绕开useKey认证的情况下,只能使用…...

【RabbitMQ笔记09】消息队列RabbitMQ之常见方法的使用
这篇文章,主要介绍消息队列RabbitMQ之常见方法的使用。 目录 一、消息队列常见方法 1.1、连接工厂ConnectionFactory 1.2、连接Connection 1.3、通道Channel 1.4、交换机相关方法 (1)exchangeDeclare()声明交换机 1.5、队列相关方法 …...

Linux字符设备驱动模型之设备号
从上文中可知,在Linux用户空间中,如若需要操作硬件设备,均通过/dev目录下的设备文件节点进行操作,基本上每一种设备都会存在一个或者多个的设备节点。 并且在Linux内核中,其表示字符设备的结构成员也提供了相应的设备号…...

C++多态原理
请看下面的程序,该程序演示了多态类对象存储空间的大小。 #include <iostream> using namespace std; class A {public:int i;virtual void func() {}virtual void func2() {} }; class B : public A {int j;void func() {} }; int main() {cout << si…...

PMP认证与NPDP认证哪个含金量高?
两个证涉及的领域不一样的,一个是项目管理,对应的是项目经理;一个是产品管理,对应的是产品经理。含金量不能相比,但在各自的领域的含金量是很高的,至少专业程度或者知名度是最高的。 我来分别说一下PMP认证…...

改进YOLOv7-Tiny系列:首发改进结合BiFPN结构的特征融合网络,网络融合更多有效特征,高效涨点
💡该教程为改进进阶指南,属于《芒果书》📚系列,包含大量的原创首发改进方式, 所有文章都是全网首发原创改进内容🚀 内容出品:CSDN博客独家更新 @CSDN芒果汁没有芒果 💡本篇文章 基于 YOLOv5、YOLOv7芒果改进YOLO系列:芒果改进YOLOv7-Tiny系列:首发改进结合BiFPN结…...

PPC Insights系列:洞见安全多方图联邦
开放隐私计算开放隐私计算开放隐私计算OpenMPC是国内第一个且影响力最大的隐私计算开放社区。社区秉承开放共享的精神,专注于隐私计算行业的研究与布道。社区致力于隐私计算技术的传播,愿成为中国 “隐私计算最后一公里的服务区”。183篇原创内容公众号知…...

大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...