拼多多 2019 春季算法实习生在线笔试

1. 题目一

给出两个数组,求两个数组对应元素乘积的最小值。

先对两个数组排序,然后用第一个数组的最大值和第二个数组的最小值相乘,依次遍历即可。

?#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;
bool ascend(int i, int j) {return (i < j);}
bool descend(int i, int j) {return (i > j);}

int main()
{
    int n = 0;
    scanf("%d", &n);

    vector<int> a;
    for (int i = 0; i < n; i++)
    {
        int temp = 0;
        scanf("%d", &temp);
        a.push_back(temp);
    }

    sort(a.begin(), a.end(), ascend); // a 升序排列

    vector<int> b;
    for (int i = 0; i < n; i++)
    {
        int temp = 0;
        scanf("%d", &temp);
        b.push_back(temp);
    }

    sort(b.begin(), b.end(), descend); // b 升序排列

    int sum = 0;
    for (int i = 0; i < n; i++)
    {
        sum += a[i] * b[i];
    }

    cout << sum;

    return 0;
}

2. 题目二

一套英文字母卡片序列,将重复字母剔除后字母序最小(不区分大小写)的序列中第一张卡片是哪个字母?

例:xaBXY 剔除重复字母后可以为 xaby 或者 abxy,其中字母序最小的为 abxy,第一张卡片为 a

第一次遍历,记录每个字母出现的位置,若多次出现,则保留最后面的位置。

第二次遍历,初始化 result 为 ‘z‘,如果访问到的元素小于 result 则更新之。一直向后遍历,直到访问到某个字母的位置与第一步记录的位置一样,则说明后面没有有重复字母,结束。


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <map>

using namespace std;

#define N 52

int main()
{
    char data[N] = {'\0'};

    gets(data);
    int i = 0;
    map<int, char> pos;

    while (data[i] != '\0')
    {
        if (data[i] <= 'Z' && data[i] >= 'A') data[i] = data[i] + 32;
        int temp = data[i] - 'a';
        pos[temp] = i;
        i++;
    }

    char result = '\z';
    i = 0;
    while (data[i] != '\0')
    {
        int temp = data[i] - 'a';
        if (pos[temp] != i)
        {
            if (temp < int(result))
            {
                result = temp;
            }
        }
        else
        {
            if (temp < int(result))
            {
                result = temp;
            }
            break;
        }
        i++;
    }

    cout << char(result + 'a');

    return 0;
}

3. 题目三

银行抢劫问题。一个二维数组,第一维代表 n 个银行的位置,第二维代表每个银行可抢劫的金额,两个劫匪抢银行,要求银行距离大于 d,求可以抢劫的金额最大值。

按照金钱对银行进行排序,从后向前进行遍历,也即从可抢劫金额最大开始。如果两个银行的距离大于 d,更新结果。

如果某一次遍历发现当前两个相邻银行的金额之和比结果还要小,也就是前面所有的银行可抢劫额都比结果小,提前结束循环。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>

using namespace std;

void Quick_Sort(int data[][2], int left, int right);

int main()
{
    int n = 0;
    int d = 0;
    scanf("%d %d", &n, &d);

    int data[n][2];

    for (int i = 0; i < n; i++)
    {
        scanf("%d %d", &data[i][0], &data[i][1]);
    }
    Quick_Sort(data, 0, n-1);

    int result = 0;
    for (int i = n-1; i >= 0; i--)
    {
        int max_sum_1 = 1;
        if (i > 1)  max_sum_1 = data[i][1] + data[i-1][1];
        if (max_sum_1 <= result) goto END;
        for (int j = i-1; j >= 0; j--)
        {
            int max_sum_2 = data[i][1] + data[j][1];
            if (abs(data[i][0] - data[j][0]) >= d)
                result = max(result, max_sum_2);
        }
    }

    END:    cout << result;
    return 0;
}

void Quick_Sort(int data[][2], int left, int right)
{
    if (left < right)
    {
        int pivot = data[left][1];
        int temp = data[left][0];
        int i = left;
        int j = right;
        while (i < j)
        {
            while (i < j && data[j][1] >= pivot)    j--;
            if (i < j)
            {
                data[i][0] = data[j][0];
                data[i++][1] = data[j][1];
            }
            while (i < j && data[i][1] <= pivot)    i++;
            if (i < j)
            {
                data[j][0] = data[i][0];
                data[j--][1] = data[i][1];
            }
        }
        data[i][1] = pivot;
        data[i][0] = temp;
        Quick_Sort(data, left, i-1);
        Quick_Sort(data, i+1, right);
    }
}

4. 题目四

给出两个由圆括号组成的字符串,交错这两个圆括号序列,但要保持每个字符在源字符串中的位置,问总共有多少种交错方式可以得到合法的圆括号表达式。

回溯法。遍历所有情况,当两个字符串都结束时查看生成的表达式是否合法。程序正确性待检验,笔试后自己线下总结的。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <stack>

using namespace std;
void Find(string &s, unsigned int i, string &t, unsigned int j, string result);
long long int num = 0;
long long int  N = 1e9 + 7;

int main()
{
    string s;
    string t;
    cin >> s >> t;

    string result;

    Find(s, 0, t, 0, result);

    num = num % N;
    cout << num << endl;

    return 0;
}

bool Is_Valid(string s)
{
    unsigned int i = 0;
    stack<char> bracket;
    while (i < s.size())
    {
        if (s[i] == '(')
        {
            bracket.push(s[i]);
        }
        else
        {
            if (bracket.empty())    return false;
            char temp = bracket.top();
            if (temp == '(')
            {
                bracket.pop();
            }
            else
            {
                return false;
            }
        }
        i++;
    }
    if (bracket.empty())    return true;
    else return false;
}

void Find(string &s, unsigned int i, string &t, unsigned int j, string result)
{
    if (i == s.size() && j == t.size())
    {
        if (Is_Valid(result))
        {
            num++;
            return;
        }
    }
    else if ((i < s.size() && j < t.size()))
    {
        string temp(result);
        result.push_back(s[i]);
        Find(s, i+1, t, j, result);
        temp.push_back(t[j]);
        Find(s, i, t, j+1, temp);
    }
    else if ((i < s.size() && j == t.size()))
    {
        result.push_back(s[i]);
        Find(s, i+1, t, j, result);
    }
    else //if ((i == s.size() && j < t.size()))
    {
        result.push_back(t[j]);
        Find(s, i, t, j+1, result);
    }
}

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

原文地址:https://www.cnblogs.com/seniusen/p/10585505.html

时间: 2024-10-25 17:44:51

拼多多 2019 春季算法实习生在线笔试的相关文章

字节跳动 2019 春季算法实习生在线笔试

1. 题目一 求最少收到多少硬币,即优先用大面额的硬币找零,类似于求一个数的个位十位百位. #include <iostream> #include <stdio.h> using namespace std; int main() { int n; scanf("%d", &n); int change = 1024 - n; int a = change / 64; int b = (change - a * 64) / 16; int c = (c

2015阿里巴巴前端实习生在线笔试考后总结

写在前面 还是太年轻,第一次在线笔试有些紧张了 一.2015题目 我遇到的题目:6个选择其中3个多选,1个填空,6个大题.客服姐姐说题目是随机给的(因为给了一个时段考试,而不是统一时间点开考),不过题型应该是固定的. 单选:一个数组,两个引用,相互赋值,问输出 眩晕抗性-30% 单选:问一个return匿名函数的函数的执行结果,内部还有apply 眩晕抗性再-69% 单选:问字符串替换结果是什么,当然,又是套了几层,绕了几圈 眩晕抗性再-1%,嗯,做完这道给彻底绕晕了 多选:移动端,如果A按钮上

京东2019暑期实习生在线笔试(原创)

第一题: 题目描述:现有红绿两种颜色的石头,现在我们需要用这两种石头搭建一个塔,塔需要满足如下三个条件:1,第一层应该包含1块石头,第二层应该包含两块,第i块需要包含i块石头:2,同一层的石头应该是同一个颜色(红或绿):3,塔的层数尽可能多.问在满足上述三个条件的前提下,有多少种不同的建造塔的方案,当塔中任意一个对应位置的石头颜色不同,我们就认为这两个方案不相同.石头可以不用完. 输入:输入仅包含两个正整数,分别表示红和绿砖块的数量a,b(0<=a,b<=2*10**5,a+b>=1)输

2016届阿里实习生在线笔试附加题3

#include<iostream> using namespace std; int a[1000]; int waiting = 1; int main(){ int temp = 0; int i = 0; while(cin>>temp){ a[temp] = 1; if(temp == waiting){ cout<<waiting; for(i = waiting + 1;a[i] == 1;i++){ cout<<","&l

实习生在线笔试问题整理

1.下列CSS3新特性在移动端兼容性较好,我们可以在工作中使用的是? A.position:sticky;作用是让一个区块在窗口中保持可见,当区块没有超出浏览器范围时,作用相当于position:relative;当超出l可视窗口时,作用相当于position:fixed;缺点是兼容性不行,谷歌都不支持了. B.字体大小或尺寸单位使用:以前只用px来做字体大小或尺寸单位,现在用em,是一个相对单位,可以随着浏览器可视窗口的改变而改变,所以是正确答案. C.CSS.supports() API;兼

阿里在线笔试算法工程师附加题

前几天参加了阿里的在线笔试,报的职位是算法工程师,笔试感觉难度适中,选择题包含数据结构.离散数学.小的智力问题还有一些读程序选结果的题目.其中数据结构和排列组合最多.当时比较慌乱,没做记录.只记下了三个附加题. 第一题很简单.要求实现一个方法,在两个排好序(升序)的整型数组中找到中位数.传入4个参数,分别是两个数组和他们的大小.这个题目既然简单就要写的高效一些.我用的归并排序的思想,将两个数组合并,在合并的过程中找到中位数.并对奇偶分情况讨论,注意偶数情况下有可能出现小数.代码如下: doubl

前端 2018 届校招笔试面经【百度,阿里,腾讯,阿里文娱,携程,美团,拼多多】

百度 1.块级元素和行内元素的区别和举例2.HTML5的新特性3.清除浮动的方法4.BFC清除浮动的原理5.盒子模型6.标准模式和兼容模式7.闭包的定义8.原型链和作用域链9.作用域链和闭包的区别10.Object的原型对象是什么11.怎么判断一个属性是对象上的属性还是其原型对象上的属性12.判断一个对象类型为数组13.网络安全的防御14.localStorage和cookie的区别15.前端性能优化16.层叠上下文17.手写events模块18.手写将一个段落里的单词首字母都大写的函数 1.三

2015阿里巴巴春季Java实习生面试经验

2015阿里巴巴春季Java实习生面试经验 一.笔试 大概今年四月初的时候在线进行了笔试,笔试题目都是考基础的,包括数据结构.计算机网络.操作系统.数据库原理等,Java基础的话不用说,个人建议可以去看一下<Java编程思想>这本书,这本书提到了许多细节的东西,是初学者提升Java基础的一本好书. 网上笔试不久,就收到了阿里的短信和邮件,说我通过了网上笔试和简历筛选,并叫我到网上去预约时间,我登录到网上的时候才发现,距离面试时间(5月5日~5月7日)还有差不多一个月的时间,因为我选择的面试地点

面试完还呗、拼多多、蚂蚁金服、趣头条、京东到家之后,我知道了这些

最近一个朋友,在谋求架构师岗位的工作,经历了魔都的一批互联网公司的洗礼,让他把面试经历整理了一下,给大家一些经验吧,希望各位后面去这些公司面试的时候,能有些心理准备. 还呗 地点:2号线金科路地铁站(长泰广场A座) 环境:环境还不错,装修偏简约风,工位是互联网公司那种排排坐. 投递方式:拉勾网 面试流程:开始是做自我介绍,然后聊项目经历. 整体评价:说实话我怀疑还呗是打着招聘的幌子,只是约面试而已,不是实际想招人.因为面试基本上没有问太多问题,然后说后面约二面,但是后面打电话联系说招聘冻结,所以