以下内容来自于应聘者回忆整理
很多同学都想得到淘宝的实习或者校招机会。那从过来人的角度谈谈,要通过淘宝的实习、校招面试,都有哪些经验和注意事项呢?今天就跟大家分享一下。
1、二维数组按行优先存储,A[2][3]的地址是 1087,A[4][7]的地址是 1153,请问 A[6][7]的地址是多少?
A[2][3]和A[4][7]之间间隔2行加4个成员,加上它们自身,共2*8+4+2=22个成员,
它们的地址间偏移为:1153-1087=66,所以每个成员的存储占3个地址空间。
A[6][7]和A[4][7]之间间隔2行,加上它们自身,共2*8+2=18个成员,
所以A[6][7]的地址为:1153+3*18=1207,
2、实施软件需求时,常用工具应包括那些?
在软件开发中,需求分析阶段常使用的工具有数据流图 (DFD)、数据字典 (DD)、判断树和判断表。
3、单元测试通常采用方法?
单元测试多采用白盒测试技术,系统内多个模块可以并行地进行测试。
4、二分法检索表用什么存储?
5、进程模型和线程模型有哪些优缺点
多线程的优点:
- 无需跨进程边界;
- 程序逻辑和控制方式简单;
- 所有线程可以直接共享内存和变量等;
- 线程方式消耗的总资源比进程方式好;
多线程缺点:
- 每个线程与主程序共用地址空间,受限于2GB地址空间;
- 线程之间的同步和加锁控制比较麻烦;
- 一个线程的崩溃可能影响到整个程序的稳定性;
- 到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
- 线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU
多进程优点:
- 每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
- 通过增加CPU,就可以容易扩充性能;
- 可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
- 每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大
多线程缺点:
- 逻辑控制复杂,需要和主程序交互;
- 需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
- 多进程调度开销比较大;
6、二分查找的非递归算法
(1)非递归算法中,用的是while,break循环。. 循环停止的条件是区间为0 ,或者是在区间不为0时已找到该数。. (2)递归算法中,用的是if () {}return语句,满足If条件时, {先缩小区间,然后调用递归},if语句需要判断的是当区间不为0且仍没有找到数时,才继续缩小区间和调用递归。. (注意两个条件关系是&&而不是||,因为如果是||的话,即使查找区间缩小为0了,当没有找到数时,内部会继续更新Low和high的值,造成比较数的时候数组下标溢出) 用上述我自己编写的递归算法不太直观,容易出错。. (2)递归调用总是尝试去解决一个规模更小的子问题,这样递归才能收敛到最简单的情况。.
7、虚析构函数的作用?举例。
虚析构函数是为了避免内存泄露,而且是当子类中会有指针成员变量时才会使用得到的。
8、什么时候调用拷贝构造函数?
如果一个对象是被传入自己的拷贝构造函数,它的拷贝构造函数将会被调用来拷贝这个对象这样复制才可以传入它自己的拷贝构造函数,这会导致无限循环直至栈溢出(Stack Overflow)。 除了当对象传入函数的时候被隐式调用以外,拷贝构造函数在对象被函数返回的时候也同样的被调用。 通常的原则是:对于凡是包含动态分配成员或包含指针成员的类都应该提供拷贝构造函数;在提供拷贝构造函数的同时,还应该考虑重载"="赋值操作符号。
9、语句 int* ptr; *ptr = 10; 有问题吗?
10、 int a[3][2] = {1, 2, 3, 4, 5, 6}; int *p[3]; p[0] = a[1]; *(p[0] + 1)指向的内容是多少? 11、请写出下面语句的输出char str1[] = "abc"; char str2[] = "abc"; const char str3[] = "abc"; const char str4[] = "abc"; const char* str5 = "abc"; const char* str6 = "abc"; cout << (str1 == str2) << endl; //true or false cout << (str3 == str4) << endl; cout << (str5 == str6) << endl
想要更多阿里巴巴实习、校招的机会。请点击这里