经典面试题收集

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;
}


 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值