阿里巴巴2018屆應屆生在線編程測驗-研發工程師C/C++

剛纔去作了阿里巴巴的編程測驗,好消息是抽到的題相對別的題簡單一些,壞消息是編的太慢了,沒有作完.ios

如今把題目和本身後來編出來的代碼貼在這裏,供你們參考.編程

 

題目:

1. 從命令行輸入若干個正整數(大於等於2個),獲得一個集合N。
2. 從N中任意取出兩個數並求和,獲得的值構成集合A。
3. 從N中任意取出兩個數,並求差的絕對值,獲得的值構成集合B。
4. 從集合A和集合B當中,任意取出兩個數,其差的絕對值,又構成集合D
D的最小元素是d1,D的最大元素是d2,D的元素個數是s
請輸出d1+d2+s網絡

題目要求curl

編譯器版本: 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函數

題目中的代碼:url

 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種:     spa

     種類                                      特性                                                                   示例命令行

輸入迭代器                   讀,不能寫,只支持自增                                                istream_iteratorcode

輸出迭代器                   寫,不能讀,只支持自增               ostream_iteratorblog

前向迭代器       讀和寫,只支持自增                 unordered_map、unordered_set

雙向迭代器       讀和寫,支持自增和自減               map,set,list

隨機訪問迭代器            讀和寫,支持完整的迭代器算術運算                            string,vector,deque

相關文章
相關標籤/搜索