字节跳动视频面试经历

字节跳动视频面试题 C++方向

过程

投递简历两天后有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