飞书后端一面

大家好~今天给大家带来一位学弟飞书面试一面的面试复盘。(仅部分重要题目)
转载链接:https://www.bilibili.com/read/cv15459752?spm_id_from=333.999.0.0

网络相关

对于一个HTTP流过来之后我们应该如何处理。

对于这个这个问题,首先我们需要了解http协议的头部字段,我们可以直接对照http的头部字段按照json格式一个个进行k-v健值对的解析出来。然后根据自己需要的字段信息来获取想要的信息。

了解哪些 nginx 负载均衡算法,分别有什么优缺点。

轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务,如果后端某台服务器死机,自动剔除故障系统,使用户访问不受影响。

upstream bakend {
    server 192.168.0.1;
    server 192.168.0.2;
}




轮询权值


weight的值越大分配到的访问概率越高,主要用于后端每台服务器性能不均衡的情况下。或者仅仅为在主从的情况下设置不同的权值,达到合理有效的地利用主机资源。

upstream bakend {
    server 192.168.0.1 weight=10;
    server 192.168.0.2 weight=10;
}


ip_hash


每个请求按访问IP的哈希结果分配,使来自同一个IP的访客固定访问一台后端服务器,并且可以有效解决***页存在的session共享问题。每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

upstream bakend {
    ip_hash;
    server 192.168.0.1:88;
    server 192.168.0.2:80;
}


负载均衡调度状态


在Nginx upstream模块中,可以设定每台后端服务器在负载均衡调度中的状态,常用的状态有

down,表示当前的server暂时不参与负载均衡

weight 默认为1,weight越大,负载的权重就越大。

backup,预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的访问压力最低

max_fails,允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。

fail_timeout,请求失败超时时间,在经历了max_fails次失败后,暂停服务的时间。max_fails和fail_timeout可以一起使用。


upstream bakend{
      ip_hash;
      server 192.168.0.1:90 down;
      server 192.168.0.1:80 weight=2;
      server 192.168.0.2:90;
      server 192.168.0.2:80 backup;
}



socket编程

1. socket 编程中,哪些时候可能会造成超时现象。

首先我们可以知道我们三次握手有一个半链接队列被用于syn攻击,这样的话我们这里肯定是有超时操作的。

socket接收数据有一种阻塞式的接收有超时操作,如果长时间没有读取数据会自动断开。

编程题:


1. 给出一个 nums 集合,请你求出有多少对 (i, j) 满足 nums[i] + rev(nums[j]) = nums[j] + rev(nums[i]) ,其中 rev(x) 表示 x 反转后的值,例如 rev(120) = 21,rev(123) = 321,求出的答案对 1e9 + 7 取模。

思路:将表达式移项得到:nums[i] - rev(nums[i]) = nums[j] - rev(nums[j]),那么对于每一个 i 计算出相应的 nums[i] - rev(nums[i]) 然后用 map 存起来,之后枚举时只需要得到 1~i - 1中有多少个和 i 相同即可。

代码:
#include <bits/stdc++.h>
using namespace std;

const int mod = 1e9 + 7;

int rev(int x) {
	int ret = 0;
	while (x) {
		ret = ret * 10 + x % 10;
		x /= 10;
	}
	return ret;
}

int solve(vector<int>& nums) {
	unordered_map<int, int> m;
	int ans = 0;
	for (int i = 0 ; i < nums.size() ; i ++) {
		int cur = nums[i] - rev(nums[i]);
		ans = (1LL * ans + m[cur]) % mod;
		m[cur] ++;
	}
	return ans;
}

int main() {
    vector<int> nums = {120, 130, 140, 150, 160};
    cout << solve(nums) << endl;
    return 0;
}

2. C++ 实现一个有序链表类,支持添加和删除元素的功能,添加元素时,将元素添加到合适位置,例如 1->3->7,添加 5 后变为 1->3->5->7;删除元素时,删除所有值为 value 的节点,例如 1->5->5->7,删除 5 后变为 1->7;
#后端##面经##字节跳动##后端开发#
全部评论
Hello 我这边是字节的飞书部门 我每天花两三个小时帮忙内推 全程跟进 提供各种帮助 事事有回应 欢迎找我啊
点赞 回复 分享
发布于 2022-03-02 15:43
楼主,第二道算法用的遍历插入删除还是用的跳表这样的结构
点赞 回复 分享
发布于 2022-03-02 15:20

相关推荐

点赞 评论 收藏
分享
JamesGosling1:同一个公司的实习为什么写三次,就算是不同的小组的话,直接写一段要好点吧
点赞 评论 收藏
分享
评论
点赞
23
分享

创作者周榜

更多
牛客网
牛客企业服务