zoukankan      html  css  js  c++  java
  • 阿里巴巴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(), '
    ');
    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(), '
    ');
    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

  • 相关阅读:
    GCD
    vue中前进刷新、后退缓存方案收集
    vue cli3 项目配置
    CSS 多行省略失效 (-webkit-box-orient 失效) Second Autoprefixer control comment was ignored. Autoprefixer applies control comment to whole block, not to next rules.
    vue 设置当前页背景色
    vue history模式下的微信支付,及微信支付授权目录的填写,处理URL未注册
    h5 audio播放问题,audio获取缓存进度条
    h5页面ios键盘弹出收起后页面底部留白问题
    vue项目中引入vant 使用rem布局问题
    vue history模式下的微信分享
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/7197637.html
Copyright © 2011-2022 走看看