阿里信息二面
6.1---
最汗流浃背的一集,先是自我介绍,然后问了一下职业规划。
①一个线程和协程之间区别
②协程的两种类型(这我真不会)
之后就是两道场景题手撕
①给定一个input文件,文件中有大量的不重复的数字,数字的范围不超过七位数,内存空间只给2MB,如何排序后输出到一个ouput文件中。
这里我首先说用归并排序的思想来做,每次从文件中读取2MB数据到内存中进行排序,再将文件输出到一个result_1.txt文件中,以此类推得到result_n.txt文件,由于这些临时文件内部有序,可以每次从这些文件中读取下一个数字,依次将最小的数字写入到ouput文件中。(面试官说可以,但是不太满意,因为这种方式会产生大量的文件io,效率低下,要求我用一次读写io来实现)
之后就是第二个思路,由于数字的范围优先,那我就可以开辟一个固定大小的数组,然后将数字作为下标,将对应下标的数组的值置为1,这样就能表示这个数字是否存在,但是这种思路会超内存,因为10^8 * 8 = 10MB(大约),超出了2MB的要求。要我考虑能不能用bit做,我说了思路,每个字节的01表示8个数字的是否存在,面试官认可,接着又抛出第二个问题:如果是数字在某一区间比较稀疏,如何优化效率
最后问我知不知道bitmap,让我用bitmap做(不会)
②给定一个十六进制数组(byte[]),如何将十六进制数转换成对应的字符串类型,例如{0x11,0xff} -> "11ff",这个对来说简单了,先弄一个16长的数组 []string, 下标对应字符串,然后遍历十六进制数组,将十六进制数拆分成4bit两部分,每个4bit转换成十进制,拼接对应数组[]string下标中的字符串即可
代码如下:
for i:=0;i
left := int8(nums[i]) & int8(0x0f)
right := int8(nums[i]) > 4
result += str[left] + str[right]
}
6.3-----------------------------已挂
学到了很多东西
但是技术栈不太契合,做C++的,算法第一题bitmap没做出来,留下了遗憾吧。
至此阿里所有部门都挂了,大概之后都和阿里无缘了。