面经--Naturali算法实习生

笔试三道题

  1. Combine two strings a and b.
string Combine(string str1,string str2)
{
    if (str1 == "") { cout << "str2:"; return str2; }
    if (str2 == "") { cout << "str1:"; return str1; }
    int i = str1.length()-1; //第一个字符串从末尾遍历
    int j = 0; //第二个字符串从开头遍历
    while (i >= 0 && j < str2.length()){
        if (str1[i] == str2[j]){ i--; j++; }
        else{ break; }
    }
    string str(str1, 0, i+1 ); //str初始化取第一个字符串前部分
    str += str2.substr(j); //加上第二个字符串后部分
    return str;
}

2.n个整数的数组[a1,a2,…,an],List L=[]. 对于每两个数ai 和 aj (i < j),
min(ai, aj)放入 L. 所以L共有 n×(n-1)/2个整数 . 请找出L中
第 k-th 大的数. (O(n) time)(剑指offer)
//功能实现总函数,由三个子函数完成
//子函数1:计算List的第k-th 大的数是数组a的第rank 小的数
int find_Kth_ina_Rank(int n, int k){
    int i = 1;
    while (k > 0){ k -= i; i++; }
    int rank = n+1-i ;
    return rank;
}
//子函数2:使用快速排序为模型,处理划分一边时平均时间为0(n)
int partition(int a, int low, int high)
{
    int pivotkey;
    pivotkey = a[low];
    while (low < high)
    {
        while(low < high && pivotkey <= a[high])
            high--;
        a[low] = a[high];
        while(low = a[low])
            low++;
        a[high] = a[low];
    }
    a[low] = pivotkey;
    return low;
}
//子函数3:判断处理哪一边,并在找到后返回目标值
int sort(int a, int low, int high, int tofindRank)
{
    int p;
    if (low == high)
        return a[low];
    if (low < high)
    {
        p = partition(a, low, high);
        if ( p+1 == tofindRank) //当为第tofindRank小时,返回a[p]
            return a[p];
        else if (p+1 > tofindRank)
            return sort(a, low, p - 1, tofindRank);
        else
            return sort(a, p + 1, high, tofindRank );
    }
}
//总函数
int find_Kth_in_List(int *a, int n, int k)
{
    int rank = find_Kth_ina_Rank(n, k);
    int find = sort(a, 0, n - 1, rank);
    return find;
}
3. 买卖苹果最大收益
给出含n个非负整数的数组,表示每天苹果价格,最多只能拥有一个苹果。不限买卖次数,每次买入手续费固定为p,求最大利润。(时间O(n))
Example:
Input: price = [0, 2, 1, 8, 4, 9], p = 2
Output: 9
buy at price[0], sell at price[3], buy at price[4], sell at price[5]
profit = (8-0-2)+(9-4-2) = 9
一次买卖
int MaxProfit(vector prices){
    int buy=INT_MIN,sell=0;
    for(int i=0;i<prices.size();i++){
        buy = max(buy, -prices[i]);
        sell = max(sell, buy + prices[i]);
    }
    return sell;
}
多次买卖
int MaxProfit(vector prices){
 int buy=INT_MIN,sell=0;
 for(int i=0;i<prices.size();i++){
     buy = max(buy, sell - prices[i]);
     sell = max(sell, buy + prices[i]);  
 }
 return sell;    
}
每次买卖手续费p
int MaxProfit(vector prices,int p){
     int buy = INT_MIN, sell = 0;
     for(int i = 0;i < prices.size();i++){
         buy = max(buy, sell - prices[i] - p);
         sell = max(sell, buy + prices[i]);
     }
 return sell;
 }
```

一面:
1.求数组中一个落单的数字,别的都是成对数字。时间O(n),空间O(1)
2.二维数组,a [i] [j] < a [i+1] [j] && a [i] [j]< a [i] [j+1],查找给定数字 (剑指offer)
3.动态规划:末日传送 vt [i,j]=v0[I,j] 1.1^(t-1) 任意两个节点间花费随时间增长
求A.-B的最小花费
状态转移方程:cost[j][t] = min ( cost[k][t-1] + v[k][j]
pow(1.1, t-1) , cost[j][t-1] )

double min_cost_AtoB(vector<vector<double>>& v,int n,int A,int B) {
    vector<vector<double>> cost (n, vector<double>(n) );
    // t=0时,A到每个节点的花费 for(int i = 0; i < n; i++){
        cost[i][0] = v[A][i];
    }
    for (int t = 1; t < n; t++){
        for (int j = 0; j < n; j++){
            cost[j][t]=cost[j][t-1];
            for (int k = 0; k < n; k++){
                double temp = cost[k][t - 1] + v[k][j] pow(1.1, t);
                cost [j] [t] = temp < cost [j] [t] ? temp : cost [j] [t];
            }
        }
    }
    return cost[B][n-1];
}

二面:

**

1.三次握手

2.SQL语句,索引原理

3.Linux 命令 :netstat,awd,cut,sort

4.B树和红黑树

5.算法题

**

1.两个单链表长度为m,n,在某个节点之后重合,找这个节点。(剑指offer)

指向长的链表的指针先走m-n步,再一起遍历,直到节点相同。时间O(m+n)

2.高维DP: n个数字 1 4 2 2 2 4……,每次取x个相邻相同数字,得分为x^2
取 2 2 2 得分3^2=9
取 4 4 得分 2^2=4
取 1 得分 1^2=1
总分 14
给一串数字,求 能取得的最高分
3.找出现次数超过一半的数字。时间O(n) (剑指offer)这个数字一定在数组排序的中间位置,故用partition函数直到枢纽为中间位置

6. 六级过了吗??? 多少分???

三面:
1.自我介绍
2.问项目,怎么做的,tf-idf、word2vec,处理计算方法。。
3.数据结构。红黑树
4.C++11 特性
5.二叉查找树,找中序遍历时的下个节点。(剑指offer)
1>有右子树时,下个节点为右子树的最左子树
2>无右子树,为父节点的左子树,下个节点为父节点
3>无右子树,为父节点的右子树,向上遍历直到该节点为父节点的左子树
6.sigmod函数、softMax函数、贝叶斯、svr与svm
7.概率论
n个相同的球放到m个盒子里,多少种放法:
1> 每个盒子至少一个球 :C(n-1)^(m-1) 相当于n个球中间插入m-1个挡板
2> 盒子可以为空: C
(n+m-1)^(m-1) 每个盒子为-1个球,多出m个球,转化为每个盒子至少一个球。故相当于n+m个球中间插入m-1个挡板
8.就聊到这儿?说好的Deep Learning呢?不行,我得和你说说,CNN卷积过程
N'=(N-F+2*padding)/step+1

#实习##算法工程师##面经#
全部评论
请问你是投了什么岗位呀
点赞 回复 分享
发布于 2018-05-31 23:19
最后一题求剑指offer原题
点赞 回复 分享
发布于 2018-06-08 14:37

相关推荐

点赞 11 评论
分享
牛客网
牛客企业服务