美文网首页
拼多多学霸批算法工程师在线笔试 20190728 场

拼多多学霸批算法工程师在线笔试 20190728 场

作者: seniusen | 来源:发表于2019-10-27 08:26 被阅读0次

    1. 题目一

    给定两个数组 AB,其中数组 A 是几乎严格升序排列的,几乎的定义是只需改变其中一个数,即可满足完全升序排列。你的任务是从 A 中找到这个数组,并从数组 B 中选取一个数将其代替,使得 A 是严格升序排列的,请找出 B 中满足要求的最大数字,并输出有序数组,如不存在则输出 NO。

    思路:从数组 A 中找到不满足完全升序的数字,也即 A[i] <= A[i-1]。此时,如果 A[i] 是数组 A 的最后一个元素,则只需要从 B 中找到大于 A[i-1] 的最大元素即可;如果 A[i] 不是数组 A 的最后一个元素,则需要从 B 中找到大于 A[i-1] 并且小于 A[i+1] 的最大元素。

    只通过 70% 的原因是,可以替换 A[i] 也可以替换 A[i-1],当时没有考虑到。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
        vector<int> A;
        vector<int> B;
        int temp;
        char ch;
        while (scanf("%d", &temp))
        {
            A.push_back(temp);
            ch = getchar();
            if (ch == '\n') break;
        }
    
        while (scanf("%d", &temp))
        {
            B.push_back(temp);
            ch = getchar();
            if (ch == '\n') break;
        }
    
        int num1 = 0;
        int num2 = 0;
        int pos = -1;
        for (unsigned int i = 1; i < A.size(); i++)
        {
            if (A[i] <= A[i-1])
            {
                pos = i;
                num1 = A[i-1];
                if ((i + 1) < A.size())
                {
                    num2 = A[i+1];
                }
                else num2 = -1;
                break;
            }
        }
    
        int data = num1;
        for (unsigned int i = 0; i < B.size(); i++)
        {
            if (B[i] > num1)
            {
                if (num2 == -1)
                {
                    if (B[i] > data)
                        data = B[i];
                }
                else{
                    if (B[i] < num2)
                    {
                        if (B[i] > data)
                            data = B[i];
                    }
                }
            }
        }
    
        if (data == num1)
        {
            cout << "No";
        }
        else
        {
            for (unsigned int i = 0; i < A.size(); i++)
            {
                if (i != pos) cout << A[i] << " ";
                else    cout << data << " ";
            }
        }
        return 0;
    }
    

    2. 题目二

    给定一个字符串数组,所有字符均为大写字母。请问,给定的字符串数组是否能通过更换数组中元素的顺序,从而首尾相连,形成一个环。

    思路:所谓首尾相连能形成一个环,也即字符串数组中字符串的首尾元素正好都出现了偶数次。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <stdio.h>
    
    using namespace std;
    
    int main()
    {
        vector< vector<char>> data;
        vector<char> temp;
        char ch;
        while(1){
            ch = getchar();
            if (ch == ' ')
            {
                data.push_back(temp);
                temp.clear();
            }
            else if (ch == '\n')
            {
                data.push_back(temp);
                break;
            }
            else
            {
                temp.push_back(ch);
            }
        }
    
        int num[26] = {0};
    
        for (unsigned int i = 0; i < data.size(); i++)
        {
            char start = data[i][0];
            int pos = start - 'A';
            num[pos]++;
            char endch = data[i][data[i].size()-1];
            pos = endch - 'A';
            num[pos]++;
        }
    
        bool flag = true;
        for (int i = 0; i < 26; i++)
        {
            if (num[i] % 2 != 0)
            {
                flag = false;
                break;
            }
        }
    
        if (flag)   cout << "true";
        else   cout << "false";
    
        return 0;
    }
    

    3. 题目三

    现在一共有 N 个待执行的任务,每个任务需要 Pi 的时间完成执行。同时任务之间可能会有一些依赖关系,比如任务1可能依赖任务 2 和任务 3 ,那么任务 1 必须等任务 2 和任务 3 执行完成后才能开始执行。为了最小化任务的平均返回时长,请安排所有任务的执行顺序。假设在零时刻,所有 N 个任务已到达系统。

    思路:我们用一个二维布尔数组来表示任务之间的依赖关系,比如 flag[i][j] 表示任务 j 的执行依赖于任务 i,同时统计每一个任务 i 当前依赖的任务数量 cnt[i]。当某一个任务依赖的任务数量为 0 时,当前任务可以被执行,但同时为了最小化所有任务的执行时间,我们需要先执行花费时间最短的任务。然后,随着任务的执行,我们更新数组 flag、cnt 和可以执行的任务直到所有任务都执行完毕即可。

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    #include <stdio.h>
    
    using namespace std;
    
    bool compare(vector<int> a, vector<int> b) {return a[0] < b[0];}
    
    int main()
    {
        int N, M;
        cin >> N >> M;
    
        vector<int> time(N);
        for (int i = 0; i < N; i++)
        {
            cin >> time[i];
        }
    
        bool flag[N][N];
        int cnt[N] = {0};
        for (int i = 0; i < N; i++)
        {
            cnt[i] = 0;
            for (int j = 0; j < N; j++)
                flag[i][j] = false;
        }
    
        int data[M][2];
        for (int i = 0; i < M; i++)
        {
            cin >> data[i][0] >> data[i][1];
            cnt[data[i][1]-1]++;
            flag[data[i][0]-1][data[i][1]-1] = true;
        }
    
        vector<int> temp;
        vector<vector<int> > datab;
        for (int i = 0; i < N; i++)
        {
            if (cnt[i] == 0)
            {
                //cout << i << endl;
                temp.push_back(time[i]);
                temp.push_back(i);
                datab.push_back(temp);
                temp.clear();
            }
        }
        sort(datab.begin(), datab.end(), compare);
    
        vector<int> result;
        while (!datab.empty())
        {
            int task = datab[0][1];
            result.push_back(task);
            datab.erase(datab.begin());
            for (int i = 0; i < N; i++)
            {
                if (flag[task][i])
                {
                    flag[task][i] = false;
                    cnt[i]--;
                    if (cnt[i] == 0)
                    {
                        temp.push_back(time[i]);
                        temp.push_back(i);
                        datab.push_back(temp);
                        temp.clear();
                    }
                }
            }
            sort(datab.begin(), datab.end(), compare);
        }
    
        for (int i = 0; i < N; i++)
            cout << result[i] + 1 << ' ';
    
        return 0;
    }
    

    获取更多精彩,请关注「seniusen」!


    相关文章

      网友评论

          本文标题:拼多多学霸批算法工程师在线笔试 20190728 场

          本文链接:https://www.haomeiwen.com/subject/bdwauctx.html