12年7月1日某搜索面试题

1. 如何用虚函数实现多态

 1 class A
 2 {
 3 public:
 4     virtual void print()
 5     {
 6         cout<<"THIS IS A"<<endl;
 7     }
 8 };
 9 class B:public A
10 {
11 public:
12     void print()
13     {
14         cout<<"THIS IS B"<<endl;
15     }
16 };
17 int main()
18 {
19     A a;
20     B b;
21     A* p1 = &a;
22     A* p2 = &b;
23     p1->print();
24     p2->print();
25     return 0;
26 }

 

2. 给定一个升序单链表和一个降序单链表,将两个链表合并成升序单链表

  思路: 首先将降序的单链表进行逆置,逆置算法的复杂度是O(n); 逆置之后,就变成两个升序单链表的合并,复杂度也是O(n).

  代码:这里说一下需要考虑边界问题(判断链表是否为空),代码中没有写。

 1 Node* fanxu(Node* p)         //对单链表逆置
 2 {
 3     Node *r,*q;
 4     q = NULL;                 //q用来保存后缀 初始为NULL
 5     r = NULL;                 //r用来保存前缀 初始为NULL
 6     while (p != NULL)         
 7     {
 8         q = p->next;          //q设为后缀
 9         p->next = r;          //将p的后指针指向前缀 逆置
10         r = p;                //
11         p = q;                // r p后移
12     }
13     return r;
14 }
15 
16 Node* comb(Node *h1,Node *h2)
17 {
18     Node* temp = NULL;            //保存返回的头指针
19     Node* head = NULL;            //记录当前指针
20     if (h1->val < h2->val)        //选取起始点作为合并后头指针
21     {
22         head = h1;
23         h1 = h1->next;
24     }
25     else
26     {
27         head = h2;
28         h2 = h2->next;
29     }
30     temp = head;                   //保存头指针位置
31     while (h1 != NULL &&h2 != NULL) //当两个链表都不为空
32     {
33         if (h1->val < h2->val)     //将较小的插入
34         {
35             head->next = h1;
36             h1 = h1->next;
37         }
38         else
39         {
40             head->next = h2;
41             h2 = h2->next;
42         }
43         head = head->next;
44     }
45     if (h1 != NULL)          //若h1不为空 h2为空
46     {
47         head->next = h1;      
48     }
49     else                      //若h2不为空 h1为空
50     {
51         head->next = h2;
52     }
53     return temp;
54 }

3. 给定一个数组{...ai,...,aj...},求max(ai-aj),其中i<j. 并且要求得相应max(ai-aj)中的ai与aj。

  思路:遍历一边的算法是:第一遍,标记出每个ai之后的min(aj); 遍历ai-min(aj)的差值,找出最大者。 O(n)时间复杂度

  代码:

 1     const int num = 6;                            //数组数目
 2     int arr[num];
 3     for (int i = 0 ; i < num;++i)
 4     {
 5         arr[i] = rand()%20;
 6         cout<<arr[i]<<' ';
 7     }
 8     cout<<endl;
 9     int minn[num - 1];                             //保存排在每个数之后的最小的数的下标
10     minn[num - 2] = num - 1;                       //倒数第二个数之后的最小数只能是最后一个数
11     int pos = num - 2;                                           //最大差值对应大数的下标
12     int maxx = arr[num - 2] - arr[num - 1];                //最大差值 
13     for (int i = num - 3;i >= 0;--i)               //从倒数第三个数开始
14     {
15         minn[i] = arr[i + 1]>arr[minn[i + 1]]?minn[i + 1]:i + 1;  //找到排在其之后的最小数的下标
16         if (arr[i] - arr[minn[i]] > maxx)                       //当前数减去其对应最小数差值更大
17         {
18             maxx = arr[i] - arr[minn[i]];                       //替换
19             pos = i;
20         }
21     }
22     cout<<"MAX = "<<arr[pos]<<" - "<<arr[minn[pos]]<<" = "<<maxx<<endl;    
posted @ 2012-07-02 21:03  Itachi7  阅读(302)  评论(0编辑  收藏  举报