拼多多2018校招编程题

[编程题] 最大乘积

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1) 
输入描述:
无序整数数组A[n]

输出描述:
满足条件的最大乘积

输入例子1:
3 4 1 2

输出例子1:

24

思路:因为结果一定是三个正数之积,或者两个负数一个正数之积,或者0。一开始想用两个优先队列,一个为大根堆,保存最多两个最小的负数,一个小根堆,保存最多三个正数。但优先队列的取值没有数组方便,选择用vector容器,代码见下

int maxmul() {
    int n;
    cin >> n;
    if(n < 3) return -1;
    //priority_queue<int, vector<int>, greater<int> > q1;
    //priority_queue<int, vector<int>, less<int> >q2;
    vector<int> pos;
    vector<int> neg;
    
    while(n--) {
        int tmp;
        cin >> tmp;
        if(tmp < 0) {
            sort(neg.begin(), neg.end, greater<int>());
            if(neg.size() < 2) neg.push_back(tmp);
            else if(tmp < neg[0]) neg[0] = tmp;
        }
        else if(tmp > 0) {
            sort(pos.begin(), pos.end());
            if(pos.size() < 3) pos.push_back(tmp);
            else if(tmp > pos[0]) pos[0] = tmp;
        }
    }
    
    //if(pos.size() + neg.size() < 3) return 0;
    int a = pos.size() == 3 ? pos[0] * pos[1] * pos[2] : 0;
    int b = (neg.size() == 2 && !pos.empty()) ? pos.back() * neg[0] * neg[1] : 0;
    return max(a, b);
}

[编程题] 大整数相乘

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。 
输入描述:
空格分隔的两个字符串,代表输入的两个大整数

输出描述:
输入的乘积,用字符串表示

输入例子1:
72106547548473106236 982161082972751393

输出例子1:
70820244829634538040848656466105986748

leetcode第43题 原题~

[编程题] 六一儿童节


六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力j的重量为w[j],对于每个小朋友i,当他分到的巧克力大小达到h[i] (即w[j]>=h[i]),他才会上去表演节目。老师的目标是将巧克力分发给孩子们,使得最多的小孩上台表演。可以保证每个w[i]> 0且不能将多块巧克力分给一个孩子或将一块分给多个孩子。 
 

输入描述:
 第一行:n,表示h数组元素个数
 第二行:n个h数组元素
 第三行:m,表示w数组元素个数
 第四行:m个w数组元素

输出描述:
上台表演学生人数

输入例子1:

 3 
 2 2 3
 2
 3 1

输出例子1:
1

排序,贪心

int choose(int n, vector<int> h, int m, vector<int> w) {
    int n = 0, m = 0;
    cin >> n;
    vector<int> h(n, 0);
    for(int i = 0; i < n; i++) cin >> h[i];
    cin >> m;
    vector<int> w(m, 0);
    for(int i = 0; i < m; i++) cin >> w[i];
    
    sort(h.begin(), h.end(), greater<int>());
    sort(w.begin(), w.end(), greater<int>());
    int count = 0, i = 0, j = 0, len1 = h.size(), len2 = w.size();
    while(i < len1 && j < len2) {
        while(i < len1 && j < len2 && w[j] >= h[i]) {
            j++, i++, count++;
        }
        i++;
    }
    return count;
}

[编程题] 迷宫寻路


假设一个探险家被困在了地底的迷宫之中,要从当前位置开始找到一条通往迷宫出口的路径。迷宫可以用一个二维矩阵组成,有的部分是墙,有的部分是路。迷宫之中有的路上还有门,每扇门都在迷宫的某个地方有与之匹配的钥匙,只有先拿到钥匙才能打开门。请设计一个算法,帮助探险家找到脱困的最短路径。如前所述,迷宫是通过一个二维矩阵表示的,每个元素的值的含义如下 0-墙,1-路,2-探险家的起始位置,3-迷宫的出口,大写字母-门,小写字母-对应大写字母所代表的门的钥匙 
输入描述:
迷宫的地图,用二维矩阵表示。第一行是表示矩阵的行数和列数M和N
后面的M行是矩阵的数据,每一行对应与矩阵的一行(中间没有空格)。M和N都不超过100, 门不超过10扇。

输出描述:
路径的长度,是一个整数

输入例子1:
5 5
02111
01a0A
01003
01001
01111

输出例子1:
7

bool fingpath(vector<vector<int>> matrix, vector<vector<bool>> &visited, vector<char> &key,int i, int j, int &len) {
    int m = matrix.size(), n = matrix[0].size();
    if(i < 0 || j < 0 || i >= m || j >= n || visited[i][j] || matrix[i][j] == '0') return false;
    if(matrix[i][j] == '3') return true;
    if(matrix[i][j] >= 'a' && matrix[i][j] <= 'z') key.push_back(matrix[i][j]);
    int k = -1;
    if(matrix[i][j] >= 'A' && matrix[i][j] <= 'Z') {
        for(k = 0; k < key.size(); k++)
            if(key[k] - 'a' == matrix[i][j] - 'A') {
                key.erase(key.begin() + k);
                break;
            }
    }
    if(k == key.size()) return false;
    len++;
    visited[i][j] = true;
    bool b1 = fingpath(matrix, visited, key, i+1, j, len);
    bool b2 = fingpath(matrix, visited, key, i-1, j, len);
    bool b3 = fingpath(matrix, visited, key, i, j+1, len);
    bool b4 = fingpath(matrix, visited, key, i, j-1, len);
    len--;
    return b1 || b2 || b3 || b4;
}
int pathlen(vector<vector<int>> matrix) {
    int m = matrix.size(), n = matrix[0].size();
    int i, j;
    for(i = 0; i < m; i++) {
        for(j = 0; j < n; j++)
            if(matrix[i][j] == 2) break;
    }
    
    int len = 0;
    vector<vector<bool>> visited(m, vector<bool>(n, false));
    visited[i][j] = true;
    vector<char> key;
    findpath(matrix, visited, key, i, j, len);
    return len;
}

猜你喜欢

转载自blog.csdn.net/YC_cd/article/details/81394001