网易日常实习一面面经

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 pullgit fetchgit merge 两个操作的组合。
语法

git pull [<remote>] [<branch>]
  • <remote>:指定远程仓库的名称,默认为 origin,即默认的远程仓库。
  • <branch>:指定要拉取的远程分支,默认为当前分支。

工作流程

  1. git fetch:从远程仓库拉取最新的代码(但是不会合并到本地分支)。
  2. git merge:将从远程仓库拉取下来的更改与当前本地分支进行合并。

所以,执行 git pull 相当于先执行 git fetch,然后执行 git merge
示例

1. 拉取默认远程仓库 origin 的当前分支更新

git pull

这会从远程仓库 origin 获取当前分支的最新更新,并与本地分支进行合并。
2. 拉取指定远程仓库 origin 的指定分支(例如 main)

git pull origin main

这会从远程仓库 originmain 分支拉取更新,并合并到当前本地分支。
3. 拉取更新后不进行合并(仅获取更改)

如果你想只获取远程更新,但不合并到本地分支,可以使用:

git fetch

这会从远程仓库拉取所有的更改,但不会自动合并。你可以查看更改并决定如何处理它们。
4. 使用 git pull --rebase

默认情况下,git pull 会执行一个 merge 操作,可能会产生合并提交(merge commit)。如果你想避免生成额外的合并提交,而是将本地提交“放在”远程分支的最新提交之后,可以使用 --rebase 选项。

git pull --rebase

这会让你的本地更改基于远程分支的最新更改进行重放(rebase)。
注意事项

  • 合并冲突: 如果本地更改和远程更改冲突,Git 会提示你进行冲突解决。在解决冲突后,你需要手动提交合并结果。
  • 历史记录: 如果你使用 --rebase 选项,历史记录会变得更为线性,没有合并提交。

总结

git pull 是用来从远程仓库获取并合并代码到本地的命令。
它是 git fetchgit merge 的组合,可以自动合并更新。
使用 git pull --rebase 可以避免产生额外的合并提交,使得历史记录更加整洁。

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

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

相关文章

查询语句来提取 detail 字段中包含 xxx 的 URL 里的 commodity/ 后面的数字串

您可以使用以下 SQL 查询语句来提取 detail 字段中包含 oss.kxlist.com 的 URL 里的 commodity/ 后面的数字串&#xff1a; <p><img style"max-width:100%;" src"https://oss.kxlist.com//8a989a0c55e4a7900155e7fd7971000b/commodity/20170925/20170…

Ubuntu 24.10 安装Deepseek(Ollama+openwebui)

一、Ollama安装 1.在线安装 curl -fsSL https://ollama.com/install.sh | sh 如果curl工具没有安装先执行如下命令 sudo apt install curl 验证curl是否安装成功 curl --version 安装的过程中会提示输入当前系统登录用户的密码。 安装提示success后,验证安装 ollama -…

基于YOLOv8+PyQt5的目标检测系统(环境配置+数据集+Python源码+PyQt5界面)——持续更新中

第1期 基于YOLOv8的吸烟行为检测系统&#xff08;环境配置数据集Python源码PyQt5界面&#xff09; 第2期 基于YOLOv8的玩手机行为检测系统&#xff08;环境配置数据集Python源码PyQt5界面&#xff09; 第3期 基于YOLOv8的灭火器检测系统&#xff08;环境配置数据集Python源码…

项目的虚拟环境的搭建与pytorch依赖的下载

文章目录 配置环境 pytorch的使用需要安装对应的cuda 在PyTorch中使用CUDA, pytorch与cuda不同版本对应安装指南&#xff0c;查看CUDA版本&#xff0c;安装对应版本pytorch 【超详细教程】2024最新Pytorch安装教程&#xff08;同时讲解安装CPU和GPU版本&#xff09; 配置环境…

[2025年最新]2024.3版本idea无法安装插件问题解决

背景 随着大模型的持续发展&#xff0c;特别年前年后deepseek的优异表现&#xff0c;编程过程中&#xff0c;需要解决ai来辅助编程&#xff0c;因此需要安装一些大模型插件 问题描述 在线安装插件的时候会遇到以下问题&#xff1a; 1.数据一直在加载&#xff0c;加载的很满 2.点…

怎么查看电脑显存大小(查看电脑配置)

这里提供一个简单的方法查看 winr打开cmd 终端输入dxdiag进入DirectX 点击显示查看设备的显示内存&#xff08;VRAM&#xff09; 用这个方法查看电脑配置和显存是比较方便的 dxdiag功能 Dxdiag是Windows的DirectX诊断工具&#xff0c;其主要作用包括但不限于以下几点&#…

拾取丢弃物品(结构体/数组/子UI/事件分发器)

实现&#xff1a;场景中随机生成几种物品&#xff0c;玩家可以拾取这些物品&#xff0c;也可丢弃已经拾取到的物品。 拾取丢弃物品时UI能实时更新玩家身上的物品量。 一.物品信息的创建 1.枚举 物品名 2.结构体表示物体属性 3.物品缩略图&#xff08;缩略图大小要为2的n次方…

KITE提示词框架:引导大语言模型的高效新工具

大语言模型的应用日益广泛。然而&#xff0c;如何确保这些模型生成的内容在AI原生应用中符合预期&#xff0c;仍是一个需要不断探索的问题。以下内容来自于《AI 原生应用开发&#xff1a;提示工程原理与实战》一书&#xff08;京东图书&#xff1a;https://item.jd.com/1013604…

性能优化中的系统架构优化

系统架构优化是性能优化的一个重要方面&#xff0c;它涉及到对整个IT系统或交易链上各个环节的分析与改进。通过系统架构优化&#xff0c;可以提高系统的响应速度、吞吐量&#xff0c;并降低各层之间的耦合度&#xff0c;从而更好地应对市场的变化和需求。业务增长导致的性能问…

【学习笔记】计算机网络(三)

第3章 数据链路层 文章目录 第3章 数据链路层3.1数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本功能3.1.3 其他功能 - 滑动窗口机制 3.2 点对点协议PPP(Point-to-Point Protocol)3.2.1 PPP 协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP 协议的工作状态 3.3 使用广播信…

机器学习 - 理解偏差-方差分解

为了避免过拟合&#xff0c;我们经常会在模型的拟合能力和复杂度之间进行权衡。拟合能力强的模型一般复杂度会比较高&#xff0c;容易导致过拟合。相反&#xff0c;如果限制模型的复杂度&#xff0c;降低其拟合能力&#xff0c;又可能会导致欠拟合。因此&#xff0c;如何在模型…

【STM32】ADC

本次实现的是ADC实现数字信号与模拟信号的转化&#xff0c;数字信号时不连续的&#xff0c;模拟信号是连续的。 1.ADC转化的原理 模拟-数字转换技术使用的是逐次逼近法&#xff0c;使用二分比较的方法来确定电压值 当单片机对应的参考电压为3.3v时&#xff0c;0~ 3.3v(模拟信号…

DeepSeek 助力 Vue 开发:打造丝滑的步骤条

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

基于Python的人工智能驱动基因组变异算法:设计与应用(下)

3.3.2 数据清洗与预处理 在基因组变异分析中,原始数据往往包含各种噪声和不完整信息,数据清洗与预处理是确保分析结果准确性和可靠性的关键步骤。通过 Python 的相关库和工具,可以有效地去除噪声、填补缺失值、标准化数据等,为后续的分析提供高质量的数据基础。 在基因组…

elasticsearch安装插件analysis-ik分词器(深度研究docker内elasticsearch安装插件的位置)

最近在学习使用elasticsearch&#xff0c;但是在安装插件ik的时候遇到许多问题。 所以在这里开始对elasticsearch做一个深度的研究。 首先提供如下链接&#xff1a; https://github.com/infinilabs/analysis-ik/releases 我们下载elasticsearch-7-17-2的Linux x86_64版本 …

linux部署ollama+deepseek+dify

Ollama 下载源码 curl -L https://ollama.com/download/ollama-linux-amd64.tgz -o ollama-linux-amd64.tgz sudo tar -C /usr -xzf ollama-linux-amd64.tgz启动 export OLLAMA_HOST0.0.0.0:11434 ollama serve访问ip:11434看到即成功 Ollama is running 手动安装deepseek…

力扣 单词拆分

动态规划&#xff0c;字符串截取&#xff0c;可重复用&#xff0c;集合类。 题目 单词可以重复使用&#xff0c;一个单词可用多次&#xff0c;应该是比较灵活的组合形式了&#xff0c;可以想到用dp&#xff0c;遍历完单词后的状态的返回值。而这里的wordDict给出的是list&…

【JVM详解二】常量池

一、常量池概述 JVM的常量池主要有以下几种&#xff1a; class文件常量池运行时常量池字符串常量池基本类型包装类常量池 它们相互之间关系大致如下图所示&#xff1a; 每个 class 的字节码文件中都有一个常量池&#xff0c;里面是编译后即知的该 class 会用到的字面量与符号引…

企业数据集成案例:吉客云销售渠道到MySQL

测试-查询销售渠道信息-dange&#xff1a;吉客云数据集成到MySQL的技术案例分享 在企业的数据管理过程中&#xff0c;如何高效、可靠地实现不同系统之间的数据对接是一个关键问题。本次我们将分享一个具体的技术案例——通过轻易云数据集成平台&#xff0c;将吉客云中的销售渠…

CTFHub-RCE系列wp

目录标题 引言什么是RCE漏洞 eval执行文件包含文件包含php://input读取源代码远程包含 命令注入无过滤过滤cat过滤空格过滤目录分隔符过滤运算符综合过滤练习 引言 题目共有如下类型 什么是RCE漏洞 RCE漏洞&#xff0c;全称是Remote Code Execution漏洞&#xff0c;翻译成中文…