アリババの2018期新卒のオンラインプログラミングテスト-研究開発エンジニアC/C++

25087 ワード

さっきアリババのプログラミングテストをしましたが、良いニュースは抽出した問題が他の問題に比べて簡単で、悪いニュースは編集が遅すぎて、終わっていません.
今テーマと自分が后で编んだコードをここに贴って、みんなの参考に供します.
 
タイトル:
1.複数の正の整数(2以上)をコマンドラインから入力し、1つのセットNを得る.2.Nから任意に2つの数を取り出して合計し、得られた値は集合Aを構成する.3.Nから任意に2つの数を取り出し、差分の絶対値を求め、得られた値は集合Bを構成する.4.集合Aと集合Bの中から、任意に2つの数を取り出して、その差の絶対値、また集合DDを構成する最小要素はd 1で、Dの最大要素はd 2で、Dの要素の個数はsですd 1+d 2+sを出力してください
テーマの要件
コンパイラバージョン:gcc 4.8.4標準入出力(stdin,stdout)を使用してください.すべてのプログラムを1つのファイルに書いてください.sys/stat.h、unistdなどの無効なグラフィック、ファイル、ネットワーク、システム関連のヘッダファイルと操作を使用しないでください.h , curl/curl.h , process.h時間制限:3 S(C/C++以外の言語:5 S)メモリ制限:128 M(C/C++以外の言語:640 M)入力:n//これは整数を入力する個数x 1//1番目の整数x 2//2番目の整数...xn//n番目の整数出力:m//一つの整数入力例:5101102103104105出力例:417
タイトルのコード:
 1 #include 
 2 #include 
 3 #include 
 4 #include 
 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<:streamsize>::max(), '
'); 16 vector<int> points; 17 for(size_t i=0; ii) { 18 int item; 19 cin >> item; 20 cin.ignore (numeric_limits<:streamsize>::max(), '
'); 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をサポート