一些ms技巧
1.由于精度的原因,浮点数不能用等于号比较
(非要比较两个浮点数是否相等的话,可以设置一个误差值,比如1e-8,如果两个浮点数的差的绝对值<1e-8,则表示两个浮点数相等)
2.代码的鲁棒性
我喜欢研究代码的鲁棒性,比如程序的输入是否合乎规范要求,对不符合规范的输入予以合理的处理。再比如,打开的文件不存在或者网络不能联通,对空指针进行取值操作等,都会产生不可预见的诡异行为,或者程序直接崩溃。再比如负数的右移,0x80000000,右移一位并不是0x40000000,而是0xC0000000(8+4=C)
3.TCP/IP
4.你说你精通cpp,那你觉得接下来这个代码应该输出什么?
class A { private: int n1; int n2; public: A():n2(0),n1(n2+0) { } void Print() { std::cout<<"n1:"<<n1<<",n2:"<<n2<<std::endl; } }; int main(){ A a; a.Print(); return 0; }
原理:构造函数的初始化列表是cpp中经常使用的概念.
在cpp中,成员变量的初始化顺序只与它们在类中声明的顺序有关,而与在初始化链表中的顺序无关.(所以先初始化n1,再初始化n2)
所以,n1是随机数,n2被赋值为0
5.树中两个节点的最低公共祖先
6.剑指Offer52.两个链表的第一个公共节点
涉及题目:
235.二叉搜索树的最近公共祖先简单(前面已有)
剑指Offer 52.两个链表的第一个公共节点简单(前面已有)
问面试官:是不是二叉树,并且是二叉搜索树?
如果是二叉搜索树,那么就可以找到公共节点:二叉搜索树是排序过的,位于左子树的节点都比父节点小,而位于右子树的节点都比父节点大,我们只需要从树的根节点开始和两个输入的节点进行比较.如果当前节点的值比两个节点都大,那么最低的公共祖先一定在当前节点的左子树,于是下一步可以遍历当前节点的左子节点.如果当前节点的值比两个节点都小,那最低公共祖先节点一定在当前节点的右子树中,于是下一步遍历当前节点的右子树,这样,在树中从上到下找到第一个在两个输入节点的值之间的节点就是最低公共祖先.
如果面试官说:不是二叉树搜索树,甚至连二叉树都不是,而只是普通的数,又该怎么办呢?
你再问面试官:树中的节点有没有指向父节点的指针?
面试官回答:有的,你为什么需要指向父节点的指针?
我如此回答:如果数中的每个节点都有一个指向父节点的指针,那么这个问题可以转换为求两个链表的第一个公共节点.比如输入的节点是F和H,F在链表F->D->B->A上,而H在链表H->E-B-A上,这样两个链表的第一个交点B刚好就是他们的最低公共祖先