非科班出身,觉得还是有些难度的,可能自己刷题还不够吧,面试时基本上都是在面试官提点下写出,这里贴出来仅供参考~
商汤:
一面:输入给两个数组,一个数组内数字都是不重复的,要求输出一个数组,该数组只包含两个输入数组的所有相同元素,要求算法复杂度。
eg:输入[3,10,4,9,7,8]和[6,8,10,4,2,1]
则输出[4,8,10]
思路:先排序,后双指针遍历;
#include
#include
vector find_same_num(vector &a,vector &b)
{
sort(a.begin(),a.end()); //O(n*log2(n)) 这里偷个懒,不写快排了
sort(b.begin(),b.end()); //O(n*log2(n))
vector res;
for(int i=0,j=0;i
旷视:
一面:给一个数组,返回它的最大连续子序列的和 (剑指offer原题)
思路:一维动态规划
int FindGreatestSumOfSubArray(vector array) {
if(array.empty()) return 0;
int sum = array[0], tempsum = array[0]; //注意初始值 不能设为0 防止只有负数
for(int i = 1; i < array.size(); i++) //从1开始 因为0的情况在初始化时完成了
{
tempsum = (tempsum < 0) ? array[i] : tempsum + array[i];
sum = (tempsum > sum) ? tempsum : sum;
}
return sum;
}
二面:求二值化图片中连通域问题
例如:
1 1 1 0
0 1 0 1
1 1 1 0
0 0 0 1 有三个连通区域
思路:深度优先遍历
void DFS(int R,int W,int i, int j,int **visited,int **mVexs)
{
int r,w;
visited[i][j] = 1; //将该位置的访问标签置为1
// 遍历该顶点的所有邻接顶点。若是没有访问过且元素为1,则继续深度访问
if(j>=1)
{
r = i;w = j-1;
{
if (!visited[r][w] && mVexs[r][w])
DFS(R,W,r,w, visited,mVexs);
}
}
if(j=1)
{
r = i-1;w = j;
{
if (!visited[r][w] && mVexs[r][w])
DFS(R,W,r,w, visited,mVexs);
}
}
if(i>R;
cout<<"请输入W:";
cin>>W;
int **arr=new int*[R];
for(int i=0;i>arr[i][j];
for(int i=0;i