字节后端开发面经——11.17日

  1. 上来先问项目。因为项目是操作系统,所以问了好多操作系统:
  2. 操作系统
  3. 虚拟机的技术原理是什么,我说用系统中一个文件来模拟硬盘,然后加载内核和操作系统对文件进行操作。百度也没百度到标准答案。
  4. 中断有哪些类型:异常和中断,异常是同步的。中断是异步的。详情见我之前博客:添加链接描述感觉说硬中断软中断也可。
  5. 原子操作在操作系统中怎么实现的:我没太懂他到底问的什么,我说了原子操作、中断控制、自旋锁他都说不对,然后我说就用Lock锁总线,他嗯了一下不知道对不对。实现方式有两种1.通过锁定总线添加链接描述 2.使用缓存锁(指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,那么当它执行锁操作回写到内存时,处理器不需要在总线上声言LOCK#信号,而是修改内部的内存地址,通过缓存一致性机制保证操作的原子性。
  6. 操作系统的用户态和内核态:我就简单说了一下,然后介绍了一下MAC OS 和IOS这两个态干嘛的。。感觉不是很书面,找了一个博客:一般的操作系统对执行权限进行分级,分别为用保护态和内核态。内核态相当于一个介于硬件与应用之间的层,内核有ring 0的权限,可以执行任何cpu指令,也可以引用任何内存地址,包括外围设备, 例如硬盘, 网卡,权限等级最高。用户态则权利有限,例如在内存分配中,有一部分内存是仅为内核态使用的,用户态code则不允许访问那些内存地址,每个进程只允许访问自己申请到的内存。而且不允许访问外围设备。另外在执行cpu指令的时候也可以被高优先级抢占。状态转换:1.系统调用:这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使 用操作系统提供的服务程序完成工作,具体方式与中断类似:以fork为例,fork的系统调用号是2,就把2放到eax里,然后int 0x80软中断调用处理函数,在中断向量表中查找90找到对应的中断处理程序,然后调用系统调用表,查表2执行系统调用,执行完了返回用户态。 2.异常:出错。3:外围设备中断(硬中断)外设请求CPU响应中断信号,执行中断处理程序,自然发生用户态到内核态的切换。
  7. 什么叫局部性原理:添加链接描述时间局部性:指令重复访问;空间局部性:内存临近;
  8. 计算机网络
  9. TCP连接为什么两次握手不行:避免历史连接;添加链接描述
  10. 收到历史连接怎么做:RST终止;见上连接
  11. TCP序列号有什么作用:我说按序确认,然后扯了一段序列号怎么产生的。他说还有别的。我说不知道。感觉可能跟TCP的其他机制有关。那这么说所有的机制的依赖于序列号啊。哦。。。可能他是通过这个引出TCP的一些机制。
  12. SYN攻击原理:见上连接;
  13. 数据库:
  14. 并发控制,主要介绍几种锁,排他锁,读写锁,更新锁。
  15. 索引、缓存、消息队列:不会
  16. 问答题:
  17. 问题1:有两个字符串数组,每个数组大概有10w个字符串。如何快速找到两个数组中相同的字符串。答:1.最简单的方法肯定是以第一个建哈希表,key为字符串Value为出现的次数,然后遍历第二个数组。 2.布隆过滤器(YYDS)
  18. 问题2:假设有10GB的订单数据,我们希望按照订单金额(假设金额都是正整数)进行排序,但是内存有限只有100M,没办法一次性将10GB的数据都加载到内存中,请问要怎么进行排序。 答:我说分组,比如分成100组,第一个组方0-1000,第二个放1000-2000这样,将10GB的数据插入到各个小组之后,再内部排序。 这个回答的应该是对的。我看网上说桶排序差不多一个意思。
  19. 问题3:有1亿个整数,范围是1-10亿,如何快速省内存的排序:我当时没答上来。其实使用**bitmap(位图)**即可。申请一个大小为10亿的位图(也就一两百M),然后这1亿个数每个数模10亿就得到下标,然后放到位图里就是顺序的。

代码题:一题:思路对了没写出来,就滑动窗口

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/

int n=s.size();
unordered_set<char,int> mp;
int ans=0;
int i=0,j=0;
for(j;j<n;++j)
{
	if(mp.find(s[j])!=mp.end()) 
	{
		l=max(l,mp[s[j]+1);
		++i;
	}
	mp[s[j]]=j;
	ans=max(ans,r-l+1);
}
return ans;
	
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java后端和浏览器中使用Pako.js实现Gzip的压缩和解压方法是不同的。 浏览器端: 压缩: ``` var buffer = new Uint8Array(inputString.length); for (var i = 0; i < inputString.length; i++) { buffer[i] = inputString.charCodeAt(i); } var compressed = pako.gzip(buffer); var outputString = String.fromCharCode.apply(null, new Uint16Array(compressed)); ``` 解压: ``` var compressed = new Uint8Array(inputString.length); for (var i = 0; i < inputString.length; i++) { compressed[i] = inputString.charCodeAt(i); } var decompressed = pako.inflate(compressed); var outputString = String.fromCharCode.apply(null, new Uint16Array(decompressed)); ``` 与在浏览器端相同,我们首先将输入字符串转换为一个Uint8Array,然后使用Pako.js的gzip函数将其压缩。最后,我们将压缩后的结果转换回字符串形式。 在解压的过程中,我们将输入字符串转换为Uint8Array,然后使用Pako.js的inflate函数将其解压,最后将结果转换回字符串形式。 需要注意的是,最后转换为字符串时要使用Uint16Array而不是Uint8Array,这是因为JavaScript中的字符串是基于UTF-16编码的。 Java后端: Java后端可以使用Java版的Pako库实现Gzip的压缩和解压。 引入Java版的Pako库: ``` <dependency> <groupId>io.github.azagniotov</groupId> <artifactId>pako-java</artifactId> <version>1.0.1</version> </dependency> ``` 压缩: ``` String inputString = "input string"; byte[] inputBytes = inputString.getBytes(StandardCharsets.UTF_8); byte[] compressedBytes = new Deflater().deflate(inputBytes); String outputString = new String(compressedBytes, StandardCharsets.ISO_8859_1); ``` 解压: ``` byte[] compressedBytes = inputString.getBytes(StandardCharsets.ISO_8859_1); Inflater inflater = new Inflater(); inflater.setInput(compressedBytes); byte[] buffer = new byte[1024]; ByteArrayOutputStream outputStream = new ByteArrayOutputStream(compressedBytes.length); while (!inflater.finished()) { int count = inflater.inflate(buffer); outputStream.write(buffer, 0, count); } outputStream.close(); byte[] decompressedBytes = outputStream.toByteArray(); String outputString = new String(decompressedBytes, StandardCharsets.UTF_8); ``` 在Java中,我们使用Deflater类的deflate方法进行压缩,使用Inflater类进行解压。需要注意的是,在解压的过程中,我们需要使用一个字节输出流ByteArrayOutputStream来存储解压后的字节,最后再将其转换为字符串形式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值