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;