网易日常实习一面面经
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…...

如何通过腾讯 ima.copilot 训练自己的知识库
如何通过腾讯 ima.copilot 训练自己的知识库 在信息爆炸的时代,拥有一个专属的知识库,能让我们在学习、工作中快速获取所需信息,极大地提升效率。腾讯推出的 AI 智能工作台 ima.copilot,为我们打造个人知识库提供了便利。今天&am…...

关于近期我的交流之深度思考DeepSeek归纳总结
以下内容我摘自昨天 2025-2-9 群里的讨论,只涉及我的观点内容,会让DeepSeek进行深度思考 抢财猫: 能提出一个好问题不容易的,问题边界包含了所有认知,提问题需要能力的 抢财猫: 每个人都相当于一个大模型,自己给自己投入了多少算力,训练了多少数据参数,自己心里有数…...

智能生鲜配送管理系统:生鲜及快消品行业的数字化转型利器
在生鲜及快消品行业,高效的供应链管理是企业成功的关键。随着科技的不断进步,越来越多的企业开始采用智能化管理软件来提升运营效率、降低成本并优化客户体验。今天,我们就来了解一下这类智能生鲜配送管理系统的核心功能和技术优势࿰…...

DeepSeek和ChatGPT的优劣或者区别(答案来DeepSeek和ChatGPT)
DeepSeek的答案 DeepSeek与ChatGPT作为当前两大主流AI模型,在架构设计、性能表现、应用场景等方面存在显著差异,以下从多个维度进行对比分析: 一、架构与训练效率 架构设计 DeepSeek:采用混合专家(MoE)框架…...

【C语言标准库函数】标准输入输出函数详解[5]:格式化文件输入输出
目录 一、fprintf() 函数 1.1. 函数简介 1.2. fprintf使用场景 1.3. 注意事项 1.4. 示例 二、fscanf() 函数 2.1. 函数简介 2.2. fscanf使用场景 2.3. 注意事项 2.3. 示例 三、总结 在 C 语言中,格式化文件输入输出函数能够让我们以特定的格式对文件进行…...

[概率论] 随机变量
Kolmogorov 定义的随机变量是基于测度论和实变函数的。这是因为随机变量的概念需要精确地定义其可能的取值、发生的概率以及这些事件之间的依赖关系。 测度论:在数学中,测度论是用来研究集合大小的理论,特别是无穷可数集和无界集的大小。对于…...

中国通信企业协会通信网络安全服务能力评定安全设计与集成服务能力评定三级要求准则...
安全设计与集成服务能力三级是通信网络安全服务能力评定安全设计与集成服务能力评定的最高等级,所需的要求也会更加严苛,不仅要满足安全设计与集成服务二级能力要求的所有条款,还要满足以下要求: 规模与资产要求 1)单位正规编制员…...

【C++语言】类和对象(下)
一、再谈构造函数 1.1 构造函数体赋值 在创建对象时,编译器通过调用构造函数,给对象中各个成员变量一个合适的初始值。 class Date { public:Date(int year, int month, int day){_year year;_month month;_day day;} private:int _year;int _mont…...

【Spring】什么是Spring?
什么是Spring? Spring是一个开源的轻量级框架,是为了简化企业级开发而设计的。我们通常讲的Spring一般指的是Spring Framework。Spring的核心是控制反转(IoC-Inversion of Control)和面向切面编程(AOP-Aspect-Oriented Programming)。这些功能使得开发者…...

全面理解-c++11中的智能指针
在 C 中,智能指针(Smart Pointers) 是用于自动管理动态分配内存的类模板,遵循 RAII(Resource Acquisition Is Initialization) 原则,确保资源在生命周期结束时被正确释放,避免内存泄…...