码迷,mamicode.com
首页 > 编程语言 > 详细

快手-算法工程师-笔试

时间:2020-03-22 23:59:52      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:string   快手   card   工程   tps   style   xpl   pow   @param   

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/

快手-算法工程师-笔试

标签:string   快手   card   工程   tps   style   xpl   pow   @param   

原文地址:https://www.cnblogs.com/olajennings/p/12549219.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!