网易日常实习一面面经
1. 自我介绍
2. 两道代码题:
- 第一道题:写一道链表排序题要求空间复杂度
O(1)
:已ac
插入排序算法 时间复杂度O(N^2)
,空间复杂度O(1)
class ListNode{int val;ListNode next;public ListNode(int x) {this.val = x;}
}
public class LinkedListInsertionSort {// 插入排序public ListNode insertionSort(ListNode head) {if(head == null || head.next == null)return head;ListNode dummy = new ListNode(0);ListNode cur = head;// 4 2 1 3while(cur != null){// 每次从链表的哨兵结点向后寻找插入位置ListNode prev = dummy;// 在已排序的链表中找到合适的位置插入节点while(prev.next != null && prev.next.val < cur.val){prev = prev.next;}// 保存当前链表当中的下一个节点,因为这个节点要进行插入了ListNode nextTemp = cur.next;// 将 cur 节点插入到 pre 后面cur.next = prev.next;prev.next = cur;// 继续处理下一个节点cur = nextTemp;}return dummy.next;}public static void main(String[] args) {LinkedListInsertionSort sorter = new LinkedListInsertionSort();// 创建测试链表 4 -> 2 -> 1 -> 3ListNode head = new ListNode(4);head.next = new ListNode(2);head.next.next = new ListNode(1);head.next.next.next = new ListNode(3);// 排序ListNode sorted = sorter.insertionSort(head);// 输出排序后的链表while(sorted != null){System.out.print(sorted.val + " ");sorted = sorted.next;}}
}
归并排序 时间复杂度O(nlogn)
, 空间复杂度O(nlogn)
。当然这道题不可以使用这个算法。
- 第二道题:写出可以StackOverFlow的代码
public class StackOverFlow {public static void main(String[] args) {dfs();}private static void dfs() {dfs();}
}
3. 讲一讲自己项目当中那部分是比较有成就感的。
那我就讲一下第一个项目:基于微服务架构的社区社交平台:
我认为在笔记服务当中:首先我先测试的仅使用了 Mysql
数据库存储和读取数据的接口设计,并用Jmeter 压测单机单节点,发现在本地运行笔记发布删除的吞吐量仅有 10000+/ s
,响应耗时也较高,此时我选择引用 Redis分布式缓存来对数据库查询修改接口之前加上一段缓存,此时吞吐量提升了近1倍,后面我又在Redis之前添加Caffeine 的本地缓存,吞吐量又有较高的提升。但是此时产生了二级缓存结构与Mysql数据库数据不一致的问题。因此我采取在读取记录的读策略时发现缓存当中不存在的情况下先查询数据库在添加到缓存当中。在更新、删除记录时,使用 RocketMQ 广播服务,实现集群环境下,对本地缓存中缓存的删除,达到数据一致性。并且在点赞接口支持高并发写:使用 Redis Bloom 布隆过滤器,高性能判断用户是否点赞,通过 Redis ZSET + MQ
异步落库,消费者中使用 RateLimiter
令牌桶实现流量削峰,避免了缓存雪崩,缓存穿透,缓存击穿等问题;
在用户关系服务当中:通过 Redis 缓存 + 发送顺序消息 MQ 异步存库,实现接口的高并发写与操作的顺序性,使用 Lua 脚本,避免频繁操作 Redis 造成的性能瓶颈,且保证多次操作的原子性;消费者使用联合唯一索引保证关系记录的幂等性;
4. 加入说有个用户进行了点赞,怎么统计某个笔记和内容的点赞数量
首先使用 Redis Bloom 布隆过滤器
,高性能判断用户是否点赞:然后发送MQ消息,将点赞落数据落库:最后调用计数服务通过聚合操作将数据落入数据库。
5.怎样处理中间件的消息积压问题?
发生了消息积压,这时候就得想办法赶紧把积压的消息消费完,就得考虑提高消费能力,一般有两种办法:
- 消费者扩容: 如果当前 Topic 的
Message Queue
的数量大于消费者数量,就可以对消费者进行扩容,增加消费者,来提高消费能力,尽快把积压的消息消费玩。 - 消息迁移 Queue 扩容: 如果当前 Topic 的
Message Queue
的数量小于或者等于消费者数量,这种情况,再扩容消费者就没什么用,就得考虑扩容 Message Queue。可以新建一个临时的 Topic,临时的 Topic 多设置一些 Message Queue,然后先用一些消费者把消费的数据丢到临时的 Topic,因为不用业务处理,只是转发一下消息,还是很快的。接下来用扩容的消费者去消费新的 Topic 里的数据,消费完了之后,恢复原状。
6. Java基础
6.1
String a = "abc";String b = new String("abc");String c = new String("abc");String d = "abc";System.out.println(a == b);System.out.println(b == c);System.out.println(c == d);System.out.println(d == a);
这几个用==判断是否相同,首先在字符串常量池当中创建字符串 "abc"
所以 a, d都是指向的字符串常量池的地址,b,c都是在堆上new出来的结果,由于a = "abc"先执行,所以都在堆中的对象指向字符串常量池中的地址,但是他们这两个对象地址又不相同,所以a = d, a != b, b != c, a != c。
6.2 假如当前有一个对象,要重写euqals方法,在重写euqals方法的时候要注意什么?
在重写 equals 方法时,一定要重写 hashCode 方法。equals 和 hashCode 之间有一个重要的契约:
- 如果两个对象通过 equals 比较结果相等,则它们的 hashCode 也必须相等。
- 如果两个对象通过 equals 比较结果不相等,它们的 hashCode 不一定要不同,但建议尽量不同,以提高性能。
例如String类当中重写了euqals方法,他会首先判断两个对象是否是同一个对象,即==来判断,通过 这个判断的原理就是计算两个对象的hashcode是否相同。如果相同直接返回true,不同再回判断是否类型相同长度相同,里面的元素相同等等。
如何遍历一个Map,我想要拿到他们所有的key所有的value
在 Java 中,遍历 Map 可以通过多种方式来实现。你可以选择遍历 Map 的所有键 (key),值 (value),或者键值对 (key-value pair)。
以下是几种常见的遍历 Map 的方式,适用于任何实现了 Map 接口的类(如 HashMap、TreeMap 等)。
1. 使用 for-each 和 entrySet()(推荐方式)
entrySet() 方法返回 Map 中所有键值对的集合 (Set<Map.Entry<K, V>>),你可以通过这种方式高效地遍历 Map 的所有键值对。
Map<String, String> map = new HashMap<>();
map.put("a", "apple");
map.put("b", "banana");
map.put("c", "cherry");// 遍历 key-value 对
for (Map.Entry<String, String> entry : map.entrySet()) {String key = entry.getKey();String value = entry.getValue();System.out.println("Key: " + key + ", Value: " + value);
}
2. 使用 for-each 和 keySet()
keySet() 方法返回 Map 中所有的键(Set),你可以通过这种方式获取所有键,并使用 get() 方法获取对应的值。
Map<String, String> map = new HashMap<>();
map.put("a", "apple");
map.put("b", "banana");
map.put("c", "cherry");// 遍历所有键,然后获取值
for (String key : map.keySet()) {String value = map.get(key);System.out.println("Key: " + key + ", Value: " + value);
}
3. 使用 for-each 和 values()(仅遍历值)
如果你只对值感兴趣,而不关心具体的键,可以使用 values() 方法,它返回一个 Collection,包含 Map 中的所有值。
Map<String, String> map = new HashMap<>();
map.put("a", "apple");
map.put("b", "banana");
map.put("c", "cherry");// 仅遍历值
for (String value : map.values()) {System.out.println("Value: " + value);
}
4. 使用 Iterator 遍历 entrySet()
如果你需要在遍历过程中进行删除操作或者有特殊的遍历需求,可以使用 Iterator。
Map<String, String> map = new HashMap<>();
map.put("a", "apple");
map.put("b", "banana");
map.put("c", "cherry");// 使用 Iterator 遍历 key-value 对
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {Map.Entry<String, String> entry = iterator.next();String key = entry.getKey();String value = entry.getValue();System.out.println("Key: " + key + ", Value: " + value);
}
5. Java 8 Stream API(现代方式)
如果你使用的是 Java 8 或更高版本,Stream API 可以为你提供更简洁的代码风格。
Map<String, String> map = new HashMap<>();
map.put("a", "apple");
map.put("b", "banana");
map.put("c", "cherry");// 使用 Java 8 Stream API 遍历
map.forEach((key, value) -> System.out.println("Key: " + key + ", Value: " + value));
7. JUC
7.1 假设有一个发音引擎:部署在本地最多只支持32路并发,假设有第33个请求进入翻译引擎,请问怎样实现这个业务?
可以通过阻塞队列或者是信号量来实现这个需求:
信号量实现就32个信号,没有了就阻塞
8. Linux
8.1 讲一下tail命令
tail
命令用于查看文件的末尾内容,默认情况下显示文件的最后 10 行。
语法
tail [OPTION]... [FILE]...
常用选项
选项 | 说明 |
---|---|
-n N | 显示文件的最后 N 行 |
-f | 监听文件内容变化,实时输出新增内容(常用于日志文件) |
-c N | 显示文件的最后 N 字节 |
-q | 静默模式,不输出文件名 |
-v | 始终输出文件名 |
使用示例 |
1. 查看文件最后 10 行
tail file.txt
2. 查看文件最后 20 行
tail -n 20 file.txt
3. 实时监听日志文件
tail -f /var/log/syslog
4. 监听多个文件
tail -f file1.log file2.log
5. 显示文件的最后 50 个字节
tail -c 50 file.txt
结合其他命令使用
6. 结合 grep 过滤日志
tail -f /var/log/syslog | grep "error"
退出 tail -f
在 tail -f 运行时,可以使用 Ctrl + C 退出监听模式。
总结: tail 是一个非常实用的命令,特别适用于日志文件的查看和实时监控。
8.2 如果当前有个文件他的权限是644,那么这个644代表什么?
在 Linux 中,文件权限是通过三组数字(通常是三位或四位)来表示的,每个数字代表一组用户的权限设置。数字 644 具体表示以下含义:
解释:
- 数字 6: 表示文件所有者(Owner)的权限。
- 数字 4: 表示文件所属组(Group)的权限。
- 数字 4: 表示其他用户(Others)的权限。
权限映射:
每个数字实际上是由三个二进制位组成,分别代表读(r)、写(w)和执行(x)权限:
r
(读权限) = 4
w
(写权限) = 2
x
(执行权限) = 1
-
(没有权限) = 0
权限详情:
6: 文件所有者的权限是 rw-(读 + 写,无法执行),对应二进制是 110,即 4 + 2 + 0 = 6。
4: 文件所属组的权限是 r–(只读),对应二进制是 100,即 4 + 0 + 0 = 4。
4: 其他用户的权限是 r–(只读),对应二进制是 100,即 4 + 0 + 0 = 4。
综合起来:
文件所有者: 有读和写权限(rw-)
文件所属组: 只有读权限(r–)
其他用户: 只有读权限(r–)
总结:
数字 644 代表文件权限为:
- 所有者(Owner):读和写权限(rw-)
- 所属组(Group):只读权限(r–)
- 其他用户(Others):只读权限(r–)
9. git
9.1 讲一下git的pull
在 Git 中,git pull
是一个常用的命令,用于从远程仓库获取最新的更改并将它们合并到当前本地分支。简单来说,git pull
是 git fetch
和 git merge
两个操作的组合。
语法
git pull [<remote>] [<branch>]
<remote>:
指定远程仓库的名称,默认为 origin,即默认的远程仓库。<branch>:
指定要拉取的远程分支,默认为当前分支。
工作流程
git fetch:
从远程仓库拉取最新的代码(但是不会合并到本地分支)。git merge:
将从远程仓库拉取下来的更改与当前本地分支进行合并。
所以,执行 git pull
相当于先执行 git fetch
,然后执行 git merge
。
示例
1. 拉取默认远程仓库 origin 的当前分支更新
git pull
这会从远程仓库 origin 获取当前分支的最新更新,并与本地分支进行合并。
2. 拉取指定远程仓库 origin 的指定分支(例如 main)
git pull origin main
这会从远程仓库 origin
的 main
分支拉取更新,并合并到当前本地分支。
3. 拉取更新后不进行合并(仅获取更改)
如果你想只获取远程更新,但不合并到本地分支,可以使用:
git fetch
这会从远程仓库拉取所有的更改,但不会自动合并。你可以查看更改并决定如何处理它们。
4. 使用 git pull --rebase
默认情况下,git pull 会执行一个 merge 操作,可能会产生合并提交(merge commit)。如果你想避免生成额外的合并提交,而是将本地提交“放在”远程分支的最新提交之后,可以使用 --rebase
选项。
git pull --rebase
这会让你的本地更改基于远程分支的最新更改进行重放(rebase)。
注意事项
- 合并冲突: 如果本地更改和远程更改冲突,Git 会提示你进行冲突解决。在解决冲突后,你需要手动提交合并结果。
- 历史记录: 如果你使用
--rebase
选项,历史记录会变得更为线性,没有合并提交。
总结
git pull
是用来从远程仓库获取并合并代码到本地的命令。
它是 git fetch
和 git merge
的组合,可以自动合并更新。
使用 git pull --rebase
可以避免产生额外的合并提交,使得历史记录更加整洁。
相关文章:

网易日常实习一面面经
1. 自我介绍 2. 两道代码题: 第一道题:写一道链表排序题要求空间复杂度O(1) :已ac 插入排序算法 时间复杂度 O(N^2),空间复杂度O(1) class ListNode{int val;ListNode next;public ListNode(int x) {this.val x;} } public cl…...

Excel 笔记
实际问题记录 VBA脚本实现特殊的行转列 已知:位于同一Excel工作簿文件中的两个工作表:Sheet1、Sheet2。 问题:现要将Sheet2中的每一行,按Sheet1中的样子进行转置: Sheet2中每一行的黄色单元格,为列头。…...
Python的
& 运算符可用于不同集合类型,它主要用于集合的交集操作 下面分别介绍它在 set(集合)和 frozenset(不可变集合)这两种常见集合类型中的使用 set 类型 set 是 Python 中内置的可变集合类型,使用 & …...

【个人开发】cuda12.6安装vllm安装实践【内含踩坑经验】
1. 背景 vLLM是一个快速且易于使用的LLM推理和服务库。企业级应用比较普遍,尝试安装相关环境,尝试使用。 2. 环境 模块版本python3.10CUDA12.6torch2.5.1xformers0.0.28.post3flash_attn2.7.4vllm0.6.4.post1 2.1 安装flash_attn 具体选择什么版本&…...
ASP.NET Core SignalR身份验证
在需要登录才能访问的集线器类上或者方法上添加[Authorize]。也支持角色等设置,可以设置到Hub或者方法上。 配置好User、Role、MyDbContext、JWTSettings、IdentityHelper Program.cs using SignaIR的基本使用; using Scalar.AspNetCore; using Identity框架; us…...
微信小程序(第一集)
app.json {// 定义小程序的所有页面路径,数组中的第一个页面是首页"pages": ["pages/index/index", // 首页"pages/logs/logs" // 日志页面],// 设置小程序的全局窗口外观(比如导航栏和背景颜色)"wind…...
为什么细胞是圆的?
从受力方面分析 以细胞重心 O O O为原点,建立平面直角坐标系 x O y xOy xOy, x 、 y x、y x、y正半轴交细胞于A,B 设 f θ ∑ ∀ P ∈ C , ∠ P O A θ P O ∑ ∀ P ∈ C , ∠ P O A θ 1 f_\theta\dfrac{\sum_{\forall P\in C\ \ , \an…...

游戏引擎学习第96天
讨论了优化和速度问题,以便简化调试过程 节目以一个有趣的类比开始,提到就像某些高端餐厅那样,菜单上充满了听起来陌生或不太清楚的描述,需要依靠服务员进一步解释。虽然这听起来有些奇怪,但实际上,它反映…...

本地优先的分布式锁实现
本地优先分发锁旨在通过使用本地锁优先来减少分发锁服务器的并发压力。如图1所示,当请求想要获取分发锁时,该请求必须首先获取JVM锁(本地锁)。通过这样做,对于特定的锁密钥,分布式锁服务器将只承载固定数量…...

基于知乎平台的“开源AI智能名片2 + 1链动模式S2B2C商城小程序”引流策略研究
摘要:本文聚焦于如何借助知乎平台的高权重及优质用户特性,对“开源AI智能名片2 1链动模式S2B2C商城小程序”进行有效引流。通过深入分析知乎平台的用户特点、引流规则,并结合具体的引流方法,旨在为相关项目在知乎平台实现高效用户…...
DeepSeek-Coder系列模型:智能编程助手的未来
文章目录 一、模型架构与核心功能1. 模型架构2. 核心功能 二、多语言支持与代码生成1. Python代码生成2. Java代码生成3. C代码生成4. JavaScript代码生成 三、仓库级代码理解1. 代码结构分析2. 上下文理解 四、FIM填充技术1. 函数自动填充2. 代码补全 五、应用场景1. 代码补全…...

FPGA开发技能(10)热电偶测温ADS1118方案
文章目录 1.热电偶原理2.ADS1118方案2.1ADS介绍2.2原理设计2.3实物连接图2.4测温原理 3.误差校准3.1查表法3.2冷端补偿法 4.SPI操作时序5.传送门 1.热电偶原理 两个不同材料的金属线一端在同一结点连接,另一端放在被测温点,则二者会产生一定的压差&…...
如何优化网站结构以促进快速收录?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/104.html 优化网站结构以促进快速收录,可以从以下几个方面入手: 一、合理规划页面结构 扁平化结构:采用扁平化的网站结构,减少层级…...

算法-动态规划-0-1背包问题(二维0-1背包,背包求方案数,求背包具体方案)
概念 背包问题(Knapsack Problem)是算法领域的经典组合优化问题,在资源分配等场景有广泛应用,以下从定义、常见类型、解决方法等方面介绍: 定义 给定一组物品,每个物品都有自己的重量和价值,…...

位运算算法篇:位运算实现加减乘除
位运算算法篇:位运算实现加减乘除 那么我们想必对加减乘除这些数学计算并不陌生,但是对于我们的计算机来说,由于机器只能识别二进制的语言,那么我们底层的数据都是以二进制的形式存在,那么我们CPU的计算器的加减乘除运…...

【故障处理】ORA-19849 ORA-19612 0RA-17627 ORA-03114
【故障处理】ADG duplicate 异常中断ORA-19849 ORA-19612 0RA-17627 ORA-03114 Corrupt block 84629 found during reading backup piece 一、概述二、报错信息三、报错原因四、解决方法五、其他类似报错5.1 报错信息 一、概述 部署adg执行duplicate异常中断,RMAN过…...

【MQ】Spring3 中 RabbitMQ 的使用与常见场景
一、初识 MQ 传统的单体架构,分布式架构的同步调用里,无论是方法调用,还是 OpenFeign 难免会有以下问题: 扩展性差(高耦合,需要依赖对应的服务,同样的事件,不断有新需求࿰…...

jupyterLab插件开发
jupyter lab安装、配置: jupyter lab安装、配置教程_容器里装jupyterlab-CSDN博客 『Linux笔记』服务器搭建神器JupyterLab_linux_布衣小张-腾讯云开发者社区 Jupyter Lab | 安装、配置、插件推荐、多用户使用教程-腾讯云开发者社区-腾讯云 jupyterLab插件开发教…...

拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动
拯救者Y9000P双系统ubuntu22.04安装4070显卡驱动 1. 前情: 1TB的硬盘,分了120G作ubuntu22.04。/boot: 300MB, / : 40GB, /home: 75G, 其余作swap area。 2. 一开始按这个教程:对我无效 https://blog.csdn.net/Eric_xkk/article/details/1…...
QT-常见问题
1. C(特别是 Qt)开发中,内存优化的方法 1. 合理管理对象生命周期,使用智能指针 Qt 提供了 QScopedPointer 和 QSharedPointer 来管理对象生命周期,避免手动 delete 导致的内存泄漏。 2. 减少内存占用 QString、QBy…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...

网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

Linux --进程控制
本文从以下五个方面来初步认识进程控制: 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程,创建出来的进程就是子进程,原来的进程为父进程。…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...