拼多多2018年校招真题

拼多多2018年校招真题

题目描述

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

输入描述:
无序整数数组A[n]

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

示例1
输入
3 4 1 2
输出
24

//
// Created by nexta on 2019/2/22.
//

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    int temp;
    vector<long long> max;
    vector<long long> min;
    int n;
    cin >> n;
    while (n--) {
        cin >> temp;
        sort(max.begin(), max.end(), greater<long long>());
        sort(min.begin(), min.end());
        if (max.size() < 3)max.push_back(temp);
        else if (temp > max[2])max[2] = temp;
        if (min.size() < 2)min.push_back(temp);
        else if (temp < min[1])min[1] = temp;
    }

    sort(max.begin(), max.end(), greater<long long>());
    sort(min.begin(), min.end());
    long long a = max[0] * max[1] * max[2];
    long long b = max[0] * min[0] * min[1];
    cout << (a > b ? a : b) << endl;
    return 0;
}

题目描述

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示。不能用系统自带的大整数类型。

输入描述:
空格分隔的两个字符串,代表输入的两个大整数

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

示例1
输入
72106547548473106236 982161082972751393

输出
70820244829634538040848656466105986748

import java.math.BigInteger;
import java.util.Scanner;

/**
 * @Desc:java的大整数很好的解决了大整数的相关运算
 * @Date: 2019/2/20 18:25  better late than never. 认真思考,不要直接就动手写
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String input[] = scanner.nextLine().split(" ");
        BigInteger a = new BigInteger(input[0]);
        BigInteger b = new BigInteger(input[1]);
        BigInteger c = a.multiply(b);
        System.out.println(c);
    }
}

题目描述

六一儿童节,老师带了很多好吃的巧克力到幼儿园。每块巧克力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

//
// Created by nexta on 2019/2/23.
//

#include <iostream>
#include <algorithm>
using namespace std;

int main() {
    int n, m, temp;
    cin >> n;
    int *h = new int[n];
    for (int i = 0; i < n; i++)cin >> h[i];
    cin >> m;
    int *w = new int[m];
    for (int i = 0; i < m; i++)cin >> w[i];

    sort(h, h + n);
    sort(w, w + m);
    int i = 0, j = 0, count = 0;
    while (i < n && j < m) {
        if (h[i] <= w[j]) {
            count++;
            i++;
            j++;
        } else j++;
    }
    cout << count << endl;
}

题目描述

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

输入描述:
迷宫的地图,用二维矩阵表示。第一行是表示矩阵的行数和列数M和N
后面的M行是矩阵的数据,每一行对应与矩阵的一行(中间没有空格)。M和N都不超过100, 门不超过10扇。

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

示例1

输入
5 5
02111
01a0A
01003
01001
01111

输出
7

//抄的,真心不会
// Created by nexta on 2019/2/23.
//
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

char G[104][104];
int book[104][104][1040], M, N;
int Next[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

int bfs(int x, int y);

struct node {
    int x, y, k, step;

    node(int x, int y, int k, int step) : x(x), y(y), k(k), step(step) {}
};

int main() {

    int i, j;
    //freopen("D:/clion/start/input/pdd_D.txt", "r", stdin);
    //freopen("debug/out.txt","w",stdout); //输出重定向,输出数据将保存在out.txt文件中
    while (cin >> N >> M) {
        for (int i = 0; i < N; i++)cin >> G[i];
        memset(book, 0, sizeof(book));
        int flag = 0;
        for (int i = 0; i < N; i++) {
            if (flag == 1)break;
            for (int j = 0; j < M; j++) {
                if (G[i][j] == '2') {
                    flag = 1;
                    book[i][j][0] = 1;
                    cout << bfs(i, j) << endl;
                    break;
                }
            }
        }
    }
    return 0;
}

int bfs(int startX, int startY) {
    queue<node> Q;
    Q.push(node(startX, startY, 0, 0));
    while (!Q.empty()) {
        node head = Q.front();
        Q.pop();
        if (G[head.x][head.y] == '3') return head.step;
        for (int i = 0; i < 4; i++) {
            int nx = head.x + Next[i][0], ny = head.y + Next[i][1];
            if (nx >= N || nx < 0 || ny >= M || ny < 0 || G[nx][ny] == '0') continue;
            int key = head.k;
            //记录钥匙
            if (G[nx][ny] >= 'a' && G[nx][ny] <= 'z') key = key | (1 << (G[nx][ny] - 'a'));
            //碰到门了去匹配钥匙
            if (G[nx][ny] >= 'A' && G[nx][ny] <= 'Z' && (key & (1 << (G[nx][ny] - 'A'))) == 0) continue;
            if (!book[nx][ny][key]) {
                book[nx][ny][key] = 1;
                Q.push(node(nx, ny, key, head.step + 1));
            }
        }
    }
    return 0;
}

//这个总结也是抄的
//这题就是普通的bfs多了‘钥匙’这个状态
//所以book[x][y][key]的意义就是 横坐标为x,纵坐标为y,钥匙状态为key的点是否访问过
//钥匙的状态 就用二进制数表示 最多10 把钥匙 那就是1024
//比如我现在有第二把钥匙和第四把钥匙  那么我的钥匙状态就是 0101000000 也就是 320

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值