0%

  • 业务面
  • 先自我介绍
  • 面试官表示对超声波的项目很感兴趣,让详细介绍一下
    • 大概说了一下应用场景,系统组成,难点和算法之类的
  • 又让介绍了编译器项目
    • 主要问了还可以有哪些优化方向,说了字符串匹配换成字典树,使用更好的编译器优化算法
  • 未来的发展规划
  • 对城市的倾向性
  • 还面了哪些其它公司
  • 反问环节
    • 问了面试流程和进度
  • 最后介绍部门是干啥的
    • 通信,嵌入式开发,5G标准研发,设计芯片,通信协议
    • 产品主要是基站上面的数字信号处理
    • 介绍了好久好久,什么美国打压,未来前景,美国5G行业影响力下降
    • 行业倾向性

一共就面了半个小时,后面没有别的面试流程了,面试官表示他应该就可以给出最终的结果。

hr发微信通知技术面结束了,一会儿进行综合面,一会儿。。。。


  • 技术面
  • 上来先问了一下在学校干什么,介绍了一下科研方向
  • 然后直接撕了一道代码,还不是线上IDE,还好我笔记本里有本科时用过的codeblocks。。
    • 题目:一个字符串,全部是英文字母组成,将其全排列有多少种可能。
    • 先说了思路,感觉像是一道数学题,排列组合之类的,面试官让写一下
    • 写的时候有仔细想了一下,好像当数学题做不太现实,就又想了个回溯的算法
    • 用了五分钟左右写完回溯,跑了两个样例过了
    • 面试官说回溯算法字符串如果很长解决不了,有没有什么优化办法
    • 想了能有三五分钟,面试官说可以了,自己回去再想想吧,然后面试就结束了
    • 一共就免了20分钟,感觉面试官对我的算法不满意,给我挂了

已OC


  • 实习可以任何时间过去,不一定非得暑假
  • 实习时长有要求(感觉三个月应该是可以的)
  • 工资400/天
  • 5000以上收税,不过60000以下好像会退税
  • 1000房补,要在公司附近租房
  • 有免费三餐
  • 部门是TikTok基础业务部门
  • 安卓和iOS之后可能要选择一个方向
  • 问了有没有其它的offer,都什么部门,到哪一步了
  • 问了个人意向,多个offer会作何选择
  • 能保证的大概有7 8 9三个月实习时间
  • hr小姐姐说话声音真好听~~

已挂


稍微总结以下挂的原因吧:

首先就是二面的面试形式确实也没见过,面试的主要内容是让自己去讲项目,可能项目梳理的不够清晰以及项目内的技术难点没有达到面试官的要求,总体来说面试官应该是觉得我的项目都比较简单。

然后同样的简历和项目我在tiktok那边是通过了的,而且还是高分通过,结果在腾讯这里二面挂了。其实腾讯一面表现也还行,三道算法题也算是做出来了,知识点项目啥的回答的也凑合,所以主要的问题应该还是处在二面将项目上了。可能微信确实比较难进吧,跟腾讯其它部门比起来微信应算是比较好的部门了,同时横向跟其它大厂的客户端开发比较的话,微信应该也是最好的了,所以可能对员工哪怕是实习生的要求都比较高吧。

还有就是腾讯今年裁员,虽然好像是教育方向的,但是内部好像确实在锁hc。虽然锁hc好像跟实习生没太大关系,但可能还是有点儿影响的。


  • 上来先介绍了一下面试规则和内容,主要就是聊项目,而且主要是由我自己讲。

  • 因为面试官说可以讲一下自己做的比较有成就感的东西,我就先讲了那个请假的APP。根据前几次面试经验,一般讲完这个项目面试官都会感觉挺有趣的,因为全校都在用,很有说服力,不太会在意技术细节。但是这次讲完感觉面试官不太满意,主要是觉得没有技术难度,而且后续也没什么升级,总体来说感觉比较简单吧。

  • 然后面试官让讲一下有点儿技术难度的项目,方便讨论技术细节。然后我就讲了编译器的项目,之前面试都是由面试官提问主导的,所以感觉还行,但是这次面试官完全让我自己从头到尾讲,感觉讲起来就很费劲。然后具体讨论了编译器的每一个步骤的细节和难点,感觉还是技术难点方面不太够,唯一能算技术难点的函数调用压栈出栈和编译器优化,感觉面试官也不太满意。问了一下其它优化有没有做,我都没有。。

  • 讲完两个项目还有时间,又讲了科研项目,讲完感觉面试官的反应也是平平淡淡。

  • 反问环节

    • 问了面试的流程

整个复试都在聊项目,而且聊的都不咋地,感觉又要g了。。

左值与左值引用

左值

左值就是在内存中有确定存储位置,有变量名,表达式结束后依然存在的值。

左值引用

左值引用就是绑定到左值上的引用。

左值引用的绑定

非常量左值引用只能绑定到非常量左值上;

常量左值引用可以绑定到非常量左值、常量左值、非常量右值、常量右值等所有的值类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int a=10;              //非常量左值(有确定存储地址,也有变量名)
const int a1=10; //常量左值(有确定存储地址,也有变量名)
const int a2=20; //常量左值(有确定存储地址,也有变量名)

//非常量左值引用
int &b1=a; //正确,a是一个非常量左值,可以被非常量左值引用绑定
int &b2=a1; //错误,a1是一个常量左值,不可以被非常量左值引用绑定
int &b3=10; //错误,10是一个非常量右值,不可以被非常量左值引用绑定
int &b4=a1+a2; //错误,(a1+a2)是一个常量右值,不可以被非常量左值引用绑定

//常量左值引用
const int &c1=a; //正确,a是一个非常量左值,可以被非常量右值引用绑定
const int &c2=a1; //正确,a1是一个常量左值,可以被非常量右值引用绑定
const int &c3=a+a1; //正确,(a+a1)是一个非常量右值,可以被常量左值引用绑定
const int &c4=a1+a2; //正确,(a1+a2)是一个常量右值,可以被常量左值引用绑定

右值与右值引用

右值

右值就是在内存没有确定存储地址、没有变量名,表达式结束就会销毁的值。

右值引用

右值引用就是在内存中没有确定存储位置,没有变量名,表达式结束后就会销毁的值。

右值引用的绑定

非常量右值引用只能绑定到非常量右值上;

常量右值引用可以绑定到非常量右值、常量右值上。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int a=10;             //非常量左值(有确定存储地址,也有变量名)
const int a1=20; //常量左值(有确定存储地址,也有变量名)
const int a2=20; //常量左值(有确定存储地址,也有变量名)

//非常量右值引用
int &&b1=a; //错误,a是一个非常量左值,不可以被非常量右值引用绑定
int &&b2=a1; //错误,a1是一个常量左值,不可以被非常量右值引用绑定
int &&b3=10; //正确,10是一个非常量右值,可以被非常量右值引用绑定
int &&b4=a1+a2; //错误,(a1+a2)是一个常量右值,不可以被非常量右值引用绑定

//常量右值引用
const int &&c1=a; //错误,a是一个非常量左值,不可以被常量右值引用绑定
const int &&c2=a1; //错误,a1是一个常量左值,不可以被常量右值引用绑定
const int &&c3=a+a1; //正确,(a+a1)是一个非常量右值,可以被常量右值引用绑定
const int &&c4=a1+a2; //正确,(a1+a2)是一个常量右值,可以被常量右值引用绑定

区别

  1. 左值引用绑定到有确定存储空间以及变量名的对象上,表达式结束后对象依然存在;右值引用绑定到要求转换的表达式、字面常量、返回右值的表达式等临时对象上,赋值表达式结束后就对象就会被销毁。

  2. 左值引用后可以利用别名修改左值对象;右值引用绑定的值不能修改。

move函数

从上述可以发现,常量左值引用可以绑定到右值上,但右值引用不能绑定任何类型的左值,若想利用右值引用绑定左值该怎么办呢?
C++11中提供了一个标准库move函数获得绑定到左值上的右值引用,即直接调用std::move告诉编译器将左值像对待同类型右值一样处理,但是被调用后的左值将不能再被使用。

1
2
3
4
5
6
7
8
9
10
int a=10;                 //非常量左值(有确定存储地址,也有变量名)
const int a1=20; //常量左值(有确定存储地址,也有变量名)

//非常量右值引用
int &&d1=std::move(a); //正确,将非常量左值a转换为非常量右值,可以被非常量右值引用绑定
int &&d2=std::move(a1); //错误,将常量左值a1转换为常量右值,不可以被非常量右值引用绑定

//常量右值引用
const int &&c1=std::move(a); //正确,将非常量左值a转换为非常量右值,可以被常量右值引用绑定
const int &&c2=std::move(a1); //正确,将常量左值a1转换为常量右值,可以被常量右值引用绑定

引入右值引用的原因

  1. 替代需要销毁对象的拷贝,提高效率:某些情况下,需要拷贝一个对象然后将其销毁,如:临时类对象的拷贝就要先将旧内存的资源拷贝到新内存,然后释放旧内存,引入右值引用后,就可以让新对象直接使用旧内存并且销毁原对象,这样就减少了内存和运算资源的使用,从而提高了运行效率;

  2. 移动含有不能共享资源的类对象:像IO、unique_ptr这样的类包含不能被共享的资源(如:IO缓冲、指针),因此,这些类对象不能拷贝但可以移动。这种情况,需要先调用std::move将左值强制转换为右值,再进行右值引用。