投递简历两天后有hr给我打电话说要约视频面试,约了两天后的上午11点(2019.2.14),面试差很少40分钟,虽然邮件中说是要面试项目经历和通用型的业务问题,可是实际上都是技术题。面试官很和蔼,一看就是技术宅。先让我说了一段自我介绍。我只说了一下毕业院校,就任经历和求职意向。而后面试官就问了一些问题,不难,可是回答的很差,次日收到了被拒的邮件。ios
一、给你一些不肯定数量的排序好的数组,数组长度不一,怎样把他们合并成一个有序数组,时间复杂度是多少?
二、实现第一个问题。没有接口,本身写函数就行,时间20min。
三、分析下面代码有什么问题。若是让你修改,你会怎么改。web
class A { public: A(int x) { p=new int(x); } ~A() { delete p; } private: int *p; } A& f(A &a) { return a; } int main() { A a(10); A b=f(a); return 0; }
四、extern "C"是什么意思
五、C++11有哪儿些智能指针?
六、用过数据库吗?(由于个人回答是没有,因此没有问,可是说明数据库也会考察到)
七、了解http,https吗?http中的状态码:500,501,502,503,504是什么意思。介绍一下cookie和session。
八、最近在学习什么新技术?
差很少问题只有这些,感受回答的好会多问一些其余的。面试
一、比较容易想到的是使用多路归并的方法,网上也流传的使用堆排序的方法。对于下面的代码使用多路归并方法实现,假设有n个数组,数组的平均长度是K,那么时间复杂度是:O(nklogn);数据库
二、
参考代码以下:数组
#include <iostream> #include <vector> using namespace std; /** * Definition of ListNode * class ListNode { * public: * int val; * ListNode *next; * ListNode(int val) { * this->val = val; * this->next = NULL; * } * } */ class ListNode { public: int val; ListNode *next; ListNode(int val) { this->val = val; this->next = NULL; } }; class Solution { public: /** * @param lists: a list of ListNode * @return: The head of one sorted list. */ ListNode *mergeKLists(vector<ListNode *> &lists) { // write your code here if(lists.size()==0) return NULL; if(lists.size()==1) return lists[0]; int mid= lists.size()/2; ListNode *leftlist=NULL; ListNode *rightlist=NULL; vector<ListNode *> leftlists; vector<ListNode *> rightlists; cout<<mid<<endl; for(int i=0;i<mid;i++) { leftlists.push_back(lists[i]); } for(int i=mid;i<lists.size();i++) { rightlists.push_back(lists[i]); } leftlist=mergeKLists(leftlists); rightlist=mergeKLists(rightlists); return merge2Lists(leftlist,rightlist); } ListNode *merge2Lists(ListNode *leftlist,ListNode *rightlist) { ListNode *p=new ListNode(0); ListNode *head=p; while(leftlist!=NULL && rightlist!=NULL) { if(leftlist->val <= rightlist->val ) { p->next=leftlist; leftlist=leftlist->next; } else { p->next=rightlist; rightlist=rightlist->next; } p=p->next; } if(leftlist!=NULL) { p->next=leftlist; } if(rightlist!=NULL) { p->next=rightlist; } return head->next; } }; int main() { Solution s; ListNode*list1 = new ListNode(1); list1->next=new ListNode(3); ListNode*list2 = new ListNode(2); list2->next=new ListNode(4); list2->next->next=new ListNode(7); ListNode*list3 = new ListNode(0); list3->next=new ListNode(9); list3->next->next=new ListNode(11); vector<ListNode *> lists; lists.push_back(list1); lists.push_back(list2); lists.push_back(list3); ListNode * result=s.mergeKLists(lists); while(result!=NULL) { cout<<result->val<<" "; result=result->next; } cout << "Hello World"; return 0; }
其余解决方案:浏览器
#include<vector> #include<iostream> #include<cmath> #include<algorithm> #include<queue> using namespace std; vector<int> sortTwoArray(vector<int>& a, vector<int>&b) { vector<int> result; int i = 0, j = 0; while (i<a.size() && j<b.size()) { if (a[i] <= b[j]) result.push_back(a[i++]); else { result.push_back(b[j]); j++; } } for (; i < a.size(); i++) result.push_back(a[i]); for (; i < b.size(); j++) result.push_back(b[j]); return result; } vector<int> sortArrays(vector<vector<int>> data) { vector<int> result; if (data.size() < 1) return result; if (data.size() == 1) return data[0]; queue<vector<int>> q; for (int i = 0; i < data.size(); i++) q.push(data[i]); while (q.size()>1) { vector<int> a = q.front(); q.pop(); vector<int> b = q.front(); q.pop(); vector<int> temp = sortTwoArray(a, b); q.push(temp); } return q.front(); } int main() { vector<vector<int>> data; vector<int> temp1 = { 0, 1, 2, 3, 4, 5, 6 }; vector<int> temp2 = { -8, -7, -6, -5, -3 }; vector<int> temp3 = { 1, 3, 5, 7, 9 }; vector<int> temp4 = { 2, 4, 6, 8 }; data.push_back(temp1); data.push_back(temp2); data.push_back(temp3); data.push_back(temp4); //排序并打印结果 vector<int> result = sortArrays(data); for (int i = 0; i < result.size(); i++) cout << result[i] << " "; cout << endl; ////测试排序两个数组 //vector<int> test = sortTwoArray(temp1, temp2); //for (int i = 0; i < test.size(); i++) // cout << test[i] << " "; //cout << endl; system("pause"); return 0; }
三、
默认拷贝构造函数属于浅拷贝,不会开辟空间,咱们能够自定义一个拷贝构造函数以下:服务器
class A { public: A(const A &a) { p=new int(*(a.p)); } }
四、
extern "C"的主要做用就是为了可以正确实现C++代码调用其余C语言代码。加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
五、shared_ptr,unique_ptr,weak_ptr
六、略
七、
500:服务器内部错误。
501:服务器不具有完成请求的功能。
502:Bad Gateway错误。
503:服务器目前没法使用。
504: Bad Gateway timeout 网关超时。cookie
cookie:
在本地计算机保存一些用户操做的历史信息(固然包括登陆信息),并在用户再次访问该站点时浏览器经过HTTP协议将本地cookie内容发送给服务器,从而完成验证,或继续上一步操做。
session:
是一种服务器端的机制,服务器使用一种相似于散列表的结构(也可能就是使用散列表)来保存信息。
八、略session