记录几道商汤,旷视面试手撕代码题~

非科班出身,觉得还是有些难度的,可能自己刷题还不够吧,面试时基本上都是在面试官提点下写出,这里贴出来仅供参考~

商汤:

一面:输入给两个数组,一个数组内数字都是不重复的,要求输出一个数组,该数组只包含两个输入数组的所有相同元素,要求算法复杂度<O(n^2)

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

 

你可能感兴趣的:(LeetCode)