阿里巴巴2017校招C++岗位在线编程题-求集合D的最大值,最小值和元素个数三者之和

来源:互联网 发布:怎么读java源码 编辑:程序博客网 时间:2024/06/03 17:58

题目:输入一组正整数为集合N;从N中任意取两个数求和得到集合A;从N任意取两个数求差的绝对值得到集合B;从集合A,B中各取一个数得到集合D;集合D中最大值d1,最小值d2,元素个数为ds,求d1+d2+ds;

思路:简单,按题目顺序来即可,注意集合元素的去重和排序即可。这题考的时候我有点粗心,一个循环遍历中少加了1居然一直没看到,然后我用来做题的电脑上居然没有gdb,没法调试,光从眼睛看居然没有发现该错误,明明代码量这么少(捂脸笑哭)。

#include <iostream>#include <vector>#include <numeric>#include <limits>#include <cmath>#include <algorithm>using namespace std;// 请完成下面这个函数,实现题目要求的功能// 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^int result(const vector <int>& inputs) {    vector <int> a;    vector <int> b;    vector <int> d;    int len = inputs.size();    int resultNum = 0;    for (int i = 0; i < len; i++)    {        for (int j = i + 1; j < len; j++)//就在这个地方少加了1,居然一直没发现        {            int calTmp = inputs[i] + inputs[j];            a.push_back(calTmp);        }    }    for (int i = 0; i < len; i++)    {        for (int j = i + 1; j < len; j++)        {            int calTmp = abs(inputs[i] - inputs[j]);            b.push_back(calTmp);        }    }    sort(a.begin(),a.end());    a.erase(unique(a.begin(), a.end()), a.end());    sort(b.begin(),b.end());    b.erase(unique(b.begin(), b.end()), b.end());    int aLen = a.size();    int bLen = b.size();    for (int i = 0; i < aLen; i++)    {        for (int j = 0; j < bLen; j++)        {            int calTmp = abs(a[i] - b[j]);            d.push_back(calTmp);        }    }    sort(d.begin(),d.end());    d.erase(unique(d.begin(), d.end()), d.end());    sort(d.begin(),d.end());    resultNum = d.front() + d.back() + d.size();    return resultNum;}int main() {    int size = 0;    cin >> size;    cin.ignore (numeric_limits<std::streamsize>::max(), '\n');    vector<int> points;    for(size_t i=0; i<size; ++i) {        int item;        cin >> item;        cin.ignore (numeric_limits<std::streamsize>::max(), '\n');        points.push_back(item);    }    int res = result(points);    cout << res << endl;    return 0;}

阅读全文
1 0
原创粉丝点击