头像

ChanLo




离线:4小时前



ChanLo
14天前

岗位介绍

商汤科技 SCG/共享技术研发中心/见习研究员
Base: 杭州

团队介绍:
共享技术研发中心,隶属于商汤SCG研发,负责商汤在智慧城市和泛安防行业方向的技术研发,主要负责人脸、人体相关识别,聚类算法的深化研究。团队leader学术、工程、行业技术经验丰富,表现良好者有机会转正及获得推荐信。

工作职责:
1、负责智慧城市相关的计算机视觉/深度学习/机器学习算法设计、研发、迭代等工作
2、研究智慧城市下的大规模应用算法的开发与性能提升,包括但不限于:超大规模人脸识别、大规模聚类分析、Reid、人群分析、 城市级别目标搜索等
3、研究相关大规模核心算法,突破算法极限和现有解决方案,包括但不限于:网络结构搜索、压缩剪枝、大规模分布式训练、持续学习等
4、维护相关研究方向的benchmark(代码、数据等)

基本要求
1、本科及以上学历,计算机、电子信息或软件等相关专业
2、具有计算机视觉、机器学习算法基础,数据挖掘或人工智能的相关经验
3、熟练使用C/C++、python中至少一种编程语言;掌握caffe、tensorflow、pytorch等深度学习框架之一;
4、具有优秀的分析问题和解决问题的能力,具有良好的沟通能力和团队合作能力,在工作中敢于突破与创新,对解决具有挑战性的问题充满激情;

优先条件:
1、行业内相关的实习、高校实验室、研究所研究经验;
2、有较强的研究能力,可以进行算法研究的创新设计和实现;
3、在国际顶尖会议或期刊发表机器学习相关论文;
4、有相关的比赛经验者或在重要数据集的排行榜上排名靠前的优先

一面

线上面试,四个面试官

  1. 自我介绍
  2. 面试官针对简历提问,面试官会就他感兴趣或者了解的点进行交流
  3. 计算机基础知识提问(线程进程等)、语言基础提问(例如 python 中何时使用多线程何时使用多进程、cpp 中指针和引用、java 相比其他语言的特点等等)
  4. 算法题(比较简单,在 ide 里写反转链表,第一次面试,有点紧脏,手忙脚乱的,表现不是很好。。。当积累经验了)
  5. 面试官继续聊项目相关内容
  6. 面试者提问

二面

单面

  1. 自我介绍
  2. 面试官针对项目提问,提了两个项目中可能会出现的问题,问我是怎么解决的
  3. 介绍一下目标检测领域中主要的方法有哪些(传统方法到现在主流的检测算法)
  4. 提问:密集人群检测中,使用NMS方法会有很多人漏检,有什么思路可以处理这个问题
  5. 算法题(重点来啦)三选二
    1. 给定N个已经排序好的数组(降序),(1)求所有数据中第K大的数字 (2) 将所有数组(M个元素)进行综合排序
      (1)优先队列,面试官还问了时间复杂度以及当N很大,超过10^9,有没有处理的办法,我没思路。。。
      (2)我的初始想法是合并多个有序序列,使用归并的思想,当N很大时,同上。。。面试官跳过了这小题
    2. 给定一个N数组,数组有正数负数,求和最大的连续子串;
      dp问题,一开始题目看错了,一看到正负数就以为是积最大连续字串,还在头疼。后来和面试官讲思路的时候才发现就是简单的dp,使用闫氏分析法(y总nb),顺利解决。然后面试官要求同时输出最大子串的首尾序号,我就加了个数组存储最大子串的首尾序号。
    3. N*N 二值矩阵, 元素值随机0或者1, (1)求全部为1的最大矩形面积 (2)求全部为1或者0的最大矩形面积
      这题面试的时候没选。粗略想法就是遍历。
  6. 面试者提问

HR面

HR常规提问:自我介绍、印象最深刻的项目经历、你从中收获的成就感、你想从这段实习中收获什么、实习时间确认…

撒花~

准备入职啦,顺便推荐一下商汤,团队比较年轻有活力,学术氛围好,和大牛们交流收获很多,对实习生非常友好,会倾斜资源帮助发文章(CVPR、AAAI、ICCV等等)

tips

有个小技巧,每年秋招结束的年末,各个公司都会有空出不少实习生的位置,而且这个时间段投递简历的人比较少,竞争没那么激烈,对简历没那么出彩的同学(像我这样没比赛、没文章)来说,是个很好的机会。

acwinger 一起加油!




ChanLo
20天前
class Solution {
public:
    int minimumDeletions(string s) {
        int n = s.size();
        vector<int> sa(n + 1), sb(n + 1);
        for (int i = 1; i <= n; i ++) {

            sa[i] = sa[i - 1];
            sb[i] = sb[i - 1];
            if (s[i - 1] == 'a') sa[i] ++;
            else sb[i] ++;
        }
        int res = INT_MAX;
        for (int i = 1; i <= n; i ++) {
            res = min(res, sb[i] + sa[n] - sa[i]);
        }
        return res;
    }
};


活动打卡代码 LeetCode 5550. 拆炸弹

ChanLo
20天前
class Solution {
public:
    vector<int> decrypt(vector<int>& code, int k) {
        int n = code.size();
        vector<int> res;
        if (k == 0) {
            for (int i = 0; i < n; i ++) res.push_back(0);
        } else if (k > 0) {
            for (int i = 0; i < n; i ++) {
                int sum = 0;
                for (int j = 1; j <= k; j ++) {
                    sum += code[(i + j) % n];
                }
                res.push_back(sum);
            }
        } else {
            for (int i = 0; i < n; i ++) {
                int sum = 0;
                for (int j = k; j < 0; j ++) {
                    sum += code[(i + j + n) % n];
                }
                res.push_back(sum);
            }
        }
        return res;
    }
};


活动打卡代码 AcWing 756. 蛇形矩阵

ChanLo
24天前
#include <iostream>

using namespace std;

const int N = 110, M = 110;
int n, m;
int f[N][M];
bool st[N][M];
int dx[] = {0, 1, 0, -1};
int dy[] = {1, 0, -1, 0};

void snake()
{
    int i = 0, j = 0, cnt = 0, dir = 0;
    while (!st[i][j])
    {
        st[i][j] = true;
        f[i][j] = ++ cnt;
        i += dx[dir], j += dy[dir];
        if (i >= 0 && i < n && j >= 0 && j < m && !st[i][j]) continue;
        i -= dx[dir], j -= dy[dir];
        dir = (dir + 1) % 4;
        i += dx[dir], j += dy[dir];
    }
    return ;
}

int main()
{
    cin >> n >> m;
    snake();
    for (int i = 0; i < n; i ++)
    {
        for (int j = 0; j < m; j ++) cout << f[i][j] << ' ';
        cout << endl;
    }
    return 0;
}


活动打卡代码 LeetCode 514. 自由之路

ChanLo
24天前
class Solution {
public:
    int findRotateSteps(string ring, string key) {
        int n = ring.size(), m = key.size();
        vector<int> pos[26];
        for (int i = 0; i < n; i ++)
            pos[ring[i] - 'a'].push_back(i);
        int dp[m][n];
        memset(dp, 0x3f3f3f3f, sizeof dp);
        for (auto& i : pos[key[0] - 'a'])
            dp[0][i] = min(i, n - i) + 1;
        for (int i = 1; i < m; i ++)
            for (auto& j : pos[key[i] - 'a'])
                for (auto& k : pos[key[i - 1] - 'a'])
                    dp[i][j] = min(dp[i][j], dp[i - 1][k] + min(abs(j - k), n - abs(j - k)) + 1);
        return *min_element(dp[m - 1], dp[m - 1] + n);
    }
};


活动打卡代码 LeetCode 127. 单词接龙

ChanLo
30天前
class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> S;
        for (string& word : wordList) S.insert(word);
        unordered_map<string, int> dist;
        dist[beginWord] = 0;
        queue<string> q;
        q.push(beginWord);

        while (q.size()) {
            auto t = q.front();
            q.pop();

            string r = t;
            for (int i = 0; i < t.size(); i ++) {
                t = r;
                for (char j = 'a'; j <= 'z'; j ++) {
                    t[i] = j;
                    if (S.count(t) && !dist.count(t)) {
                        dist[t] = dist[r] + 1;
                        if (t == endWord) return dist[t] + 1;
                        q.push(t);
                    }
                }
            }
        }
        return 0;
    }
};


活动打卡代码 AcWing 794. 高精度除法

ChanLo
1个月前
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

vector<int> div(vector<int> &A, int B, int &r)
{
    vector<int> C;

    for (int i = A.size() - 1; i >= 0; i --)
    {
        r = r * 10 + A[i];
        C.push_back(r / B);
        r %= B;
    }
    reverse(C.begin(), C.end());
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

int main()
{
    string a;
    int B;
    vector<int> A;
    cin >> a >> B;
    for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
    int r;
    vector<int> C = div(A, B, r);
    for (int i = C.size() - 1; i >= 0; i --) cout << C[i];
    cout << endl;
    cout << r << endl;
    return 0;
}


活动打卡代码 AcWing 793. 高精度乘法

ChanLo
1个月前
#include <string>
#include <iostream>
#include <vector>

using namespace std;

vector<int> mul(vector<int>& A, int B)
{
    vector<int> C;    
    int t = 0;
    for (int i = 0; i < A.size() || t; i ++)
    {
        if (i < A.size()) t += A[i] * B;
        C.push_back(t % 10);
        t /= 10;
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

int main()
{
    string a;
    int B;
    vector<int> A;
    cin >> a >> B;
    for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
    vector<int> C = mul(A, B);
    for (int i = C.size() - 1; i >= 0; i --) cout << C[i];
    cout << endl;
    return 0;
}


活动打卡代码 AcWing 792. 高精度减法

ChanLo
1个月前
#include <string>
#include <iostream>
#include <vector>

using namespace std;

bool cmp(vector<int>& A, vector<int>& B)
{
    if (A.size() != B.size()) return A.size() > B.size();
    for (int i = A.size() - 1; i >= 0; i --)
        if (A[i] != B[i])
            return A[i] > B[i];
    return true;
}

vector<int> sub(vector<int>& A, vector<int>& B)
{
    vector<int> C;    
    int t = 0, i = 0;
    for (i = 0, t = 0; i < A.size(); i ++)
    {
        t = A[i] - t;
        if (i < B.size()) t -= B[i];
        C.push_back((t + 10) % 10);
        if (t < 0) t = 1;
        else t = 0;
    }
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}

int main()
{
    string a, b;
    vector<int> A, B;
    cin >> a >> b;
    for (int i = a.size() - 1; i >= 0; i --) A.push_back(a[i] - '0');
    for (int i = b.size() - 1; i >= 0; i --) B.push_back(b[i] - '0');
    vector<int> C;
    if (cmp(A, B))
    {
        C = sub(A, B);
    }
    else
    {
        cout << '-';
        C = sub(B, A);
    }
    for (int i = C.size() - 1; i >= 0; i --) cout << C[i];
    cout << endl;
    return 0;
}



ChanLo
1个月前
#include <cstdio>

int main()
{
    int n, m, x;
    scanf("%d%d%d", &n, &m, &x);
    long long a[n], b[m];
    for (int i = 0; i < n; i ++) scanf("%lld", &a[i]);
    for (int i = 0; i < m; i ++) scanf("%lld", &b[i]);
    int p, q;
    for (int i = 0, j = m - 1; i < n; i ++) {
        while (j >= 0 && a[i] + b[j] > x) j --;
        if (a[i] + b[j] == x) p = i, q = j;
    }
    printf("%d %d\n", p, q);
    return 0;
}