经典面试题收集

来源:互联网 发布:linux glibc prnitf 编辑:程序博客网 时间:2024/06/06 00:31

1、最大间隙问题

给定n个实数,求着n个实数在实轴上向量2个数之间的最大差值,要求线性的时间算法。

方案1:最先想到的方法就是先对这n个数据进行排序,然后一遍扫描即可确定相邻的最大间隙。但该方法不能满足线性时间的要求。故采取如下方法:

  1. 找到n个数据中最大和最小数据max和min。
  2. 用n-2个点等分区间[min, max],即将[min, max]等分为n-1个区间(前闭后开区间),将这些区间看作桶,编号为,且桶i 的上界和桶i+1的下届相同,即每个桶的大小相同。每个桶的大小为:。实际上,这些桶的边界构成了一个等差数列(首项为min,公差为),且认为将min放入第一个桶,将max放入第n-1个桶。
  3. 将n个数放入n-1个桶中:将每个元素x[i] 分配到某个桶(编号为index),其中,并求出分到每个桶的最大最小数据。
  4. 最大间隙:除最大最小数据max和min以外的n-2个数据放入n-1个桶中,由抽屉原理可知至少有一个桶是空的,又因为每个桶的大小相同,所以最大间隙不会在同一桶中出现,然后扫面相邻桶的最大间距(如果有空桶,就计算空桶前后的两个桶的最大间距),顺序扫描一遍就可得到。

2、判断一个链表是否有环

struct Node {    int data;    int Node *next;};Node* testCylic(Node * h1) {   Node * p1 = h1, *p2 = h1;   while (p2!=NULL && 2->next!=NULL)   {     p1 = p1->next;     p2= p2->next->next;     if (p1 == p2) {     return p1;}    return null;}
testCylic函数测试一个链表是否有环,如果有环返回除英语环中的某个节点的指针。没有环返回空。

3、测试两个链表是否相交

(1)首先判断两个链表是否有环。

        如果没有环,直接判断两个链表的最后一个节点是否相等,相等则说明两个链表相交。不等就不想交

        如果其中一个有环,另一个没有环,那么一定不想交。

        如果两个都有环,那么首先用上面的测试环存在的函数,分别返回两个链表中处于环中的一个节点,然后在使用与判断链表是否有环的想法来判断是否相交。

bool isJoint(Node* p1,Node* p2){    Node* tmp1 = testCylic(p1);    Node* tmp2 = testCylic(p2);    if (null == tmp1 && null == tmp2))    {        return testSingle(p1,p2);    }    if (tmp1 != null && tmp2 != null)    {        Node* tmp = tmp1->next;        if (tmp == tmp1)        {            if (tmp1 == tmp2)                return true;            else                return false;        }        while (tmp != tmp1)        {            if(tmp2 == tmp1)                return true;            tmp = tmp->next->next;            tmp1 = tmp1->next;        }        return false;    }    else        return false;}


 



原创粉丝点击