字节跳动前端实习三面

拿offer啦 好开心~~

2021/12/1面试总结与收获
1.如何判断大端和小端,设计一个算法?
解决方案1:使用联合体
union test {
int a;
char b;
} c;

int main()
{
c.a = 1;
cout << (c.b & 1 ? “小端” : “大端”) << endl;
return 0;
}

思路:对于一个联合体来说,会尽可能的节省空间去存放数据,比如如果我们用小端的话,会把01给到char b去存,如果大端,b存的是00,随意这样去判断即可

解决方案2:使用强转

#include
using namespace std;
int main()
{
int a = 1; //即0x00000001
int* p = &a;
char* c = reinterpret_cast<char*>§; //类型转换,相当于char*§
//这样的话相当于去截取后面两位赋值给char c
if(*c==1)
cout<<“小端机”<<endl;
else
cout<<“大端机”<<endl;
return 0;
}
反思:遇到新问题的时候要想想看如何找一个实际的例子,比如a=1,去寻找区别实现功能,而不是在那里傻傻的
2算法题
面试时候的手打的代码,还好有面试官师兄的提醒使用dfs
#include
#include
using namespace std;
vectorpath;
vector< vector>ans;
void dfs(int cur,int n,int m,int begin, vectorpath) {
if (cur == m) {
ans.push_back(path);
return;
}
for (int i = begin; i <= n; i++) {
path.push_back(i);
dfs(cur+i,n,m,begin+1,path);//这个地方写错了,应该写i+1的,不然写begin+1的话
//会在下一轮的dfs又把当前的那个数又拿进去,出现了3 3这样的组合出来,很离谱的bug
path.pop_back();
}
}
int main() {
dfs(0, 5, 6, 1, path);
for (int i = 0; i < ans.size(); i++) {
for (int j = 0; j < ans[i].size(); j++) {
cout << ans[i][j] << " ";
}
cout << endl;
}

}
修改完的代码
#include
#include
using namespace std;
vectorpath;
vector< vector>ans;
void dfs(int cur,int n,int m,int begin, vectorpath) {
if (cur == m) {
ans.push_back(path);
return;
}
for (int i = begin; i <= n; i++) {
path.push_back(i);
dfs(cur+i,n,m,i+1,path);//这个地方写错了,应该写i+1的,不然写begin+1的话
//会在下一轮的dfs又把当前的那个数又拿进去,出现了3 3这样的组合出来,很离谱的bug
path.pop_back();
}
}
int main() {
dfs(0, 5, 6, 1, path);
for (int i = 0; i < ans.size(); i++) {
for (int j = 0; j < ans[i].size(); j++) {
cout << ans[i][j] << " ";
}
cout << endl;
}

}
反思:写代码的时候一定每一步都要心细,不可以得过且过,不然会有一些意想不到的bug和自己的思路有出入,就比如本题,我想的dfs树里是先得到一个数1,然后下一轮把这个数替换为2去继续搜索,那一个begin和i的小细节就导致这个思路的错误了!!!
3 ip头有什么(查询掘金网得到答案)
(1) 版本号:IP协议的版本。对于IPv4来说值是4
  (2) 头部长度:4位最大为0xF,注意该字段表示单位是字(4字节)
  (3) 服务类型(Type Of Service,TOS):3位优先权字段(现已被忽略) + 4位TOS字段 + 1位保留字段(须为0)。4位TOS字段分别表示最小延时、最大吞吐量、最高可靠性、最小费用,其中最多有一个能置为1。应用程序根据实际需要来设置 TOS值,如ssh和telnet这样的登录程序需要的是最小延时的服务,文件传输ftp需要的是最大吞吐量的服务
  (4) 总长度: 指整个IP数据报的长度,单位为字节,即IP数据报的最大长度为65535字节(2的16次方)。由于MTU的限制,长度超过MTU的数据报都将被分片传输,所以实际传输的IP分片数据报的长度远远没有达到最大值
  下来的3个字段则描述如何实现分片:
  (5) 标识:唯一地标识主机发送的每一个数据报,其初始值是随机的,每发送一个数据报其值就加1。同一个数据报的所有分片都具有相同的标识值
  (6) 标志: 位1保留,位2表禁止分片(DF),若设置了此位,IP模块将不对数据报进行分片,在此情况下若IP数据报超过MTU,IP模块将丢弃数据报并返回一个ICMP差错报文;位3标识更多分片(MF),除了数据报的最后一个分片,其他分片都要把它设置为1
  (7) 位偏移:分片相对原始IP数据报数据部分的偏移。实际的偏移值为该值左移3位后得到的,所以除了最后一个IP数据报分片外,每个IP分片的数据部分的长度都必须是8的整数倍

(8) 生存时间::数据报到达目的地之前允许经过的路由器跳数。TTL值被发送端设置,常设置为64。数据报在转发过程中每经过一个路由该值就被路由器减1.当TTL值为0时,路由器就将该数据包丢弃,并向源端发送一个ICMP差错报文。TTL可以防止数据报陷入路由循环
  (9) 协议: 区分IP协议上的上层协议。在Linux系统的/etc/protocols文件中定义了所有上层协议对应的协议字段,ICMP为1,TCP为6,UDP为17
  (10) 头部校验和: 由发送端填充接收端对其使用CRC算法校验,检查IP数据报头部在传输过程中是否损坏
  (11) 源IP地址和目的IP地址: 表示数据报的发送端和接收端。一般情况下这两个地址在整个数据报传递过程中保持不变,不论中间经过多少个路由器
  (12) 选项:可变长的可选信息,最多包含40字节。选项字段很少被使用。可用的IP可选项有:
  a. 记录路由: 记录数据包途径的所有路由的IP,这样可以追踪数据包的传递路径
  b. 时间戳: 记录每个路由器数据报被转发的时间或者时间与IP地址对,这样就可以测量途径路由之间数据报的传输的时间
  c. 松散路由选择: 指定路由器的IP地址列表数据发送过程中必须经过所有的路由器
  d. 严格路由选择: 数据包只能经过被指定的IP地址列表的路由器
  e. 上层协议(如TCP/UDP)的头部信息

反思:我居然只知道两个数据段…实在是汗颜,基础真的很重要,万丈高楼平地起!!不能忽视根基的打磨

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值