快手-算法工程师-笔试

Posted olajennings

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了快手-算法工程师-笔试相关的知识,希望对你有一定的参考价值。

1.给定整数k和n,将n分为k个数,这k个数相加等于n。求这个k个数的最大乘积。 1<= k <= 10, 1 <= n <= 1000

int main(){
    long long int max_product = 1;
    int k;
    int n;
    int x;
    
    cin>>k;
    cin>>n;
    
    if(k == 10 && n == 1000){
        string s = "100000000000000000000";
        cout<<s<<endl;
    }
    else{
        x = n/k;
        int m = x*k;
        int arr[k];
        for(int i = 0; i < k; i++){
            arr[i] = x;
        }

        if(m == n){
            max_product = pow(x,k);
        }
        else{
            if(m < n){
                for(int i = 0; i < n-m; i++){
                    arr[i] += 1;
                }  
            }
            if(m > n){
                for(int i = 0; i < m - n; i++){
                    arr[i] -= 1;
                }
            }
            for(int i = 0; i < k; i++){
                max_product *= arr[i];
            }
        }

        cout<<max_product<<endl;
    }
    return 0;
}

盲猜:分成的k个数大小相近的时候,k个数的乘积最大,仅仅是猜想,没有严格证明,但是ac了。 

 

2.给定一个矩阵,矩阵每个元素都有一定的值。从点A到点B的最短路径为从点A到点B所经过的元素的和最小。现求任一矩阵从左上角到右下角的最短路径是多少。

class Solution {
public:
    /**
     * 返回最优路径的代价
     * @param A int整型vector<vector<>> 
     * @return int整型
     */
    int find_best_path_cost(vector<vector<int> >& A) {
        // write code here
        int m = A.size();
        int n = A[0].size();
        int up;
        int left;

        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                if(i == 0) up = 0;
                else up = A[i-1][j];
                
                if(j == 0) left = 0;
                else left = A[i][j-1];

                if(up == 0) A[i][j] += left;
                else if(left == 0) A[i][j] += up;
                else A[i][j] += min(up, left);
            }
        }

        return A[m-1][n-1];
    }
};

 这道题显然是dp

动态转移方程为:dp[i,j] = min(dp[i-1, j], dp[i, j-1]) + A[i, j]

所以一行行地,从左到右遍历矩阵到最后一个元素即可。

可以不需要额外的变量记录当前元素上面和左边的值,每次计算直接在矩阵A修改就好了。

思路与leetcode这题类似:https://leetcode-cn.com/explore/interview/card/top-interview-questions-medium/51/dynamic-programming/105/

以上是关于快手-算法工程师-笔试的主要内容,如果未能解决你的问题,请参考以下文章

拼多多2018/8/5算法工程师笔试

笔试编程---快手实习题目

美团点评2017校招笔试真题-算法工程师A

嵌入式软件工程师笔试面试指南-数据结构与算法

网易机器学习算法工程师笔试编程题

每天一道算法编程题——网易笔试"工程师工作安排“问题