本书源码
初级程序员偏向考察算法和数据结构,高级程序猿关注专业技能和项目经验
行为面试 -> 技术面试 -> 应聘者提问 P5
行为面试:项目经验介绍(简短项目背景->自己完成任务->为了完成任务做了什么,怎么做->自己的贡献)
技术面试:链表和二叉树,二分查找,归并排序,快速排序;程序的鲁棒性、效率优化
应聘者提问:
面试需要的基础知识 P20
C++
面向对象特性,构造函数,析构函数,动态绑定,常用设计模式
内存管理
程序性能,多线程,程序安全
sizeof类 P22
sizeof空类 = 1 本来应该是0,但是要求在内存中占有一定空间(编译器决定),VS空类占1字节的空间
添加构造或析构函数 不变,添加构造或析构函数知道函数地址即可,与实例无关
添加虚函数 类型的实例中添加指向虚函数表的指针大小
复制构造函数的参数必须是本类型的引用变量 P24
面试官都期待熟练写出二分查找代码 P63
注意要处理key不在数组中的情况
//二分查找#includeusing namespace std;//递归int BinarySearch(int *array, int start, int end, int key){ if (start > end) //一定要加,若key没找到返回-1 return -1; int mid = (start + end) / 2; if (key == array[mid]) return mid; else if (key > array[mid]) return BinarySearch(array, mid + 1, end, key); else return BinarySearch(array, start, mid - 1, key);}//循环int BinarySearch2(int *array, int arrSize, int key){ if (array == NULL || arrSize <= 0) return -1; int start = 0; int end = arrSize - 1; int mid = 0; while (start <= end) //一定要有等号 { mid = (start + end) / 2; if (key == array[mid]) return mid; else if (key > array[mid]) start = mid + 1; else end = mid - 1; } return -1; //一定要加,若key没找到返回-1}int main(){ int a[10]; for (int i = 0; i < 10; i++) a[i] = i; cout << BinarySearch(a, 0, 9, 2) << endl; cout << BinarySearch2(a, 10, 2) << endl; system("pause"); return 0;}
快速排序是考察重点 P63
递归的实现要比循环简单的多,如果没有要求经可能多采用递归
递归是函数调用自身,而函数调用有时间和空间的消耗:每一次函数调用,都需要在内存栈中分配空间以保存参数,返回地址及临时变量,而从栈里雅茹数据和弹出数据都需要时间
代码规范性 P86
最好使用完整的英文单词组合命名变量和函数
错误处理方法:返回值;全局变量;异常
判断小数误差切记不能用 == ,因为计算机内表示小数时(包括float和double型小数)都有误差。判断两个小数是否相等,只能判断它们之差的绝对值是否在一个很小的范围内
编码前讲自己的思路是一个考察指标,举例子画图
C/C++程序猿要养成采用引用(或指针)传递复杂类型参数的习惯。如果采用值传递的方式,从形参到实参会产生一次复制操作。这样的复制是多余的操作,应该避免 P162
二分查找的partition函数可以用来寻找n个数中第k大的数字,这点常被用到,见面试题29、30
应聘者会被问一些需求不明确的问题,解决这些问题需要应聘者和面试官沟通
考察应聘者学习能力:一是询问应聘者最近再看什么书或者在做什么项目、从中学到哪些新技术;二是抛出一个新概念,看能否较短时间内理解这个新概念并解决相关问题
常见解题技巧:
数组从后向前复制,能减少移动次数,提高效率
快排的partition可以用于查找数组中第K大的数字
看到排序序列一定要想到二分查找
位运算一个技巧:把一个整数减去1后再和原来的数做与运算,得到的结果相当于把整数的二进制表示中最右边一个1变为0。很多二进制的问题都可以用这个思路解决。
一个指针解决不了要有两个指针的意识,要么一个起点(两个指针速度不一样),要么一前一后
全排列问题 swap fun swap