阿里巴巴2018届应届生在线编程测验-研发工程师C/C++

刚才去做了阿里巴巴的编程测验,好消息是抽到的题相对别的题简单一些,坏消息是编的太慢了,没有做完.

现在把题目和自己后来编出来的代码贴在这里,供大家参考.

 

题目:

1. 从命令行输入若干个正整数(大于等于2个),得到一个集合N。
2. 从N中任意取出两个数并求和,得到的值构成集合A。
3. 从N中任意取出两个数,并求差的绝对值,得到的值构成集合B。
4. 从集合A和集合B当中,任意取出两个数,其差的绝对值,又构成集合D
D的最小元素是d1,D的最大元素是d2,D的元素个数是s
请输出d1+d2+s

题目要求

编译器版本: gcc 4.8.4
请使用标准输入输出(stdin,stdout) ;请把所有程序写在一个文件里,勿使用已禁用图形、文件、网络、系统相关的头文件和操作,如sys/stat.h , unistd.h , curl/curl.h , process.h
时间限制: 3S (C/C++以外的语言为: 5 S) 内存限制: 128M (C/C++以外的语言为: 640 M)
输入:
n //这是输入整数的个数 x1 //第一个整数 x2 //第二个整数 ... xn //第n个整数
输出:
m //一个整数
输入范例:
5
101
102
103
104
105
输出范例:
417

题目中的代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <numeric>
 4 #include <limits>
 5 using namespace std;
 6 // 请完成下面这个函数,实现题目要求的功能
 7 // 当然,你也可以不按照这个模板来作答,完全按照自己的想法来 ^-^
 8 int result(const vector <int>& inputs) {
 9     return 0;
10 }
11 
12 int main() {
13     int size = 0;
14     cin >> size;
15     cin.ignore (numeric_limits<std::streamsize>::max(), '\n');
16     vector<int> points;
17     for(size_t i=0; i<size; ++i) {
18         int item;
19         cin >> item;
20         cin.ignore (numeric_limits<std::streamsize>::max(), '\n');
21         points.push_back(item);
22     }
23     int res = result(points);
24     cout << res << endl;
25     return 0;
26 }

 

 

自己编写的区域:

  1 //第一版 未使用set
  2 int result(const vector <int>& inputs) {
  3     vector<int> vecA;
  4     for (int i = 0; i < inputs.size() - 1; ++i)
  5     {
  6         for (int j = i + 1; j < inputs.size(); ++j)
  7         {
  8             vecA.push_back(inputs[i] + inputs[j]);
  9             for (int k = 0; k < vecA.size() - 1; ++k)
 10             {
 11                 if ((inputs[i] + inputs[j]) == vecA[k])
 12                 {
 13                     vecA.pop_back();
 14                 }
 15             }
 16         }
 17     }
 18 
 19     vector<int> vecB;
 20     for (int i = 0; i < inputs.size() - 1; ++i)
 21     {
 22         for (int j = i + 1; j < inputs.size(); ++j)
 23         {
 24             vecB.push_back((abs)(inputs[i] - inputs[j]));
 25             for (int k = 0; k < vecB.size() - 1; ++k)
 26             {
 27                 if ((abs)(inputs[i] - inputs[j]) == vecB[k])
 28                 {
 29                     vecB.pop_back();
 30                 }
 31             }
 32         }
 33     }
 34 
 35     vector<int> vecD;
 36     for (int i = 0; i < vecA.size(); ++i)
 37     {
 38         for (int j = 0; j < vecB.size(); ++j)
 39         {
 40             vecD.push_back((abs)(vecA[i] - vecB[j]));
 41             for (int k = 0; k < vecD.size() - 1; ++k)
 42             {
 43                 if ((abs)(vecA[i] - vecB[j]) == vecD[k])
 44                 {
 45                     vecD.pop_back();
 46                 }
 47             }
 48 
 49         }
 50     }
 51 
 52     int nMax, nMin;
 53     nMax = nMin = vecD[0];
 54     for (int k = 0; k < vecD.size(); ++k)
 55     {
 56         if (vecD[k] >= nMax)
 57         {
 58             nMax = vecD[k];
 59         }
 60         if (vecD[k] <= nMin)
 61         {
 62             nMin = vecD[k];
 63         }
 64     }
 65     return nMax + nMin + vecD.size();
 66 }
 67 
 68 //第二版 使用vector较多
 69 int result(const vector <int>& inputs) {
 70     set<int> setA, setB, setD;
 71 
 72     vector<int> vecA;
 73     for (int i = 0; i < inputs.size() - 1; ++i)
 74     {
 75         for (int j = i + 1; j < inputs.size(); ++j)
 76         {
 77             vecA.push_back(inputs[i] + inputs[j]);
 78         }
 79     }
 80     setA.insert(vecA.begin(), vecA.end());
 81 
 82     vector<int> vecB;
 83     for (int i = 0; i < inputs.size() - 1; ++i)
 84     {
 85         for (int j = i + 1; j < inputs.size(); ++j)
 86         {
 87             vecB.push_back((abs)(inputs[i] - inputs[j]));
 88         }
 89     }
 90     setB.insert(vecB.begin(), vecB.end());
 91 
 92     vector<int> vecD;
 93     for (int i = 0; i < vecA.size(); ++i)
 94     {
 95         for (int j = 0; j < vecB.size(); ++j)
 96         {
 97             vecD.push_back((abs)(vecA[i] - vecB[j]));
 98         }
 99     }
100     setD.insert(vecD.begin(), vecD.end());
101     vector<int> ivec(setD.begin(), setD.end());    //set没有sort函数,先加到vector中.
102     sort(ivec.begin(), ivec.end());
103     cout << ivec[0] + ivec[ivec.size() - 1] + ivec.size();
104     return 0;
105 }
106 
107 //第三版 去除不必要的vector
108 int result(const vector <int>& inputs) {
109     set<int> setA, setB, setD;
110 
111     for (int i = 0; i < inputs.size() - 1; ++i)
112     {
113         for (int j = i + 1; j < inputs.size(); ++j)
114         {
115             setA.insert(inputs[i] + inputs[j]);    //这里可以使用insert.
116         }
117     }
118 
119     for (int i = 0; i < inputs.size() - 1; ++i)
120     {
121         for (int j = i + 1; j < inputs.size(); ++j)
122         {
123             setB.insert((abs)(inputs[i] - inputs[j]));
124         }
125     }
126 
127     for (set<int>::iterator it1 = setA.begin(); it1 != setA.end(); ++it1)
128     {
129         for (set<int>::iterator it2 = setB.begin(); it2 != setB.end(); ++it2)
130         {
131             setD.insert((abs)(*it1 - *it2));
132         }
133     }
134     vector<int> ivec(setD.begin(), setD.end());    //set没有sort函数,先加到vector中.
135     sort(ivec.begin(), ivec.end());
136     return ivec[0] + ivec[ivec.size() - 1] + ivec.size();
137 
138 }

 

评论中学到的新知识

//From 木子可 
set<int> s, A, B, D;
for (auto i : inputs)    //!C++11新特性
    s.insert(i);    //!for循环省略了{}
for (auto i = s.begin(); i != prev(s.end()); i++)//!prev,next新的特性吧
    for (auto j = next(i); j != s.end(); j++)
    {
        A.insert(*i + *j);
    }

for (auto i = s.begin(); i != prev(s.end()); i++)
    for (auto j = next(i); j != s.end(); j++)
    {
        int tmp = *i - *j;
        tmp = tmp > 0 ? tmp : -tmp;
        B.insert(tmp);
    }

//From Garcia-0 

forward iterator是前向迭代器,总共有5种:     

     种类                                      特性                                                                   示例

输入迭代器                   读,不能写,只支持自增                                                istream_iterator

输出迭代器                   写,不能读,只支持自增               ostream_iterator

前向迭代器       读和写,只支持自增                 unordered_map、unordered_set

双向迭代器       读和写,支持自增和自减               map,set,list

随机访问迭代器            读和写,支持完整的迭代器算术运算                            string,vector,deque

posted @ 2017-07-17 21:30  心媛意码  阅读(8704)  评论(6编辑  收藏  举报