• 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;    
  • 相关阅读:
    css 权威指南笔记
    angular directive restrict 的用法
    vim 的寄存器
    以普通用户启动的Vim如何保存需要root权限的文件
    jshint options
    如何在Ubuntu Linux上安装Oracle Java
    Linux:使用nohup让进程在后台可靠运行
    反射-----学习Spring必学的Java基础知识之一
    java异常捕获
    cookie
  • 原文地址:https://www.cnblogs.com/itachi7/p/2573693.html
Copyright © 2020-2023  润新知