京东笔试题——集合

来源:互联网 发布:汽车刷ecu软件 编辑:程序博客网 时间:2024/06/05 12:48

1. 题目描述

  给你两个集合,要求{A} + {B}。 注:同一个集合中不会有两个相同的元素。

2. 题目解析

  首先想到是暴力破解的方法。原因是之前坐过一道两个排序链表融合的题,就是分别对比链表头的元素的大小然后取小的一端连接到答案链表中。于是我的暴力破解的思路就是将两个数据进行升序排序,一次找最小的元素放置在答案数组中。【但是,这里是转折】这种方法在本地进行计算是没有问题的,但是在线测试大规模数据的时候就会异常了。
  所以,突然我就get了容器set的优点。之前经常用vector,类似于数组,但是!但是set在这道题中体现的优点就是:
  1. set 的元素是唯一的!!对的,你没有看错!对 set 使用 insert 进行插入元素,如果这个元素刚好已经存在了,set就不会再插入这个元素了!!你说,用在这里完美不完美!!
  2. set 是默认升序的啊!完美不完美!你就说用在这里完美不完美!连排序都不需要我们自己做了。
  嗯,好,使用set优化的代码看下面吧。

3. 题目解答——cpp

#include "stdafx.h"#include <iostream>#include <set>using namespace std;int main() {    int m, n;    cin >> m >> n;    int len = m + n;    set<int> bingji;    for(int i = 0; i < len; i++) {        int num;        cin >> num;        bingji.insert(num);    }    int length = bingji.size();    set<int>::iterator p = bingji.begin();    while(length != 1) {        cout << *p << " ";        p++; length--;    }    cout << *p << endl;    return 0;}

附:(暴力破解的不美妙的解法)

但是只通过了一个测试用例,好像有bug~~有大佬看到的话,求指导啊

#include <iostream>#include <vector>#include <algorithm>using namespace std;vector<int> Merge(vector<int> num1, vector<int> num2) {    if (num1.size() == 0)        return num2;    if (num2.size() == 0)        return num1;    vector<int> answer;    if (num1.size() == 0 && num2.size() == 0)        return answer;    sort(num1.begin(), num1.end());    sort(num2.begin(), num2.end());    vector<int>::iterator abegin = num1.begin();    vector<int>::iterator bbegin = num2.begin();    while (abegin != num1.end()-1 && bbegin != num2.end()-1) {        if (*abegin < *bbegin) {            answer.push_back(*abegin);            ++abegin;        }        if (*abegin > *bbegin) {            answer.push_back(*bbegin);            ++bbegin;        }        if (*abegin == *bbegin) {            answer.push_back(*abegin);            ++abegin; ++bbegin;        }    }    if (*abegin > *bbegin) {        answer.push_back(*bbegin);        answer.push_back(*abegin);    }    else {        answer.push_back(*abegin);        answer.push_back(*bbegin);    }    abegin++;    bbegin++;    while (abegin != num1.end()) {        answer.push_back(*abegin);        ++abegin;    }    while (bbegin != num2.end()) {        answer.push_back(*bbegin);        ++bbegin;    }    return answer;}int main() {    static int n, m;    cin >> n >> m;    if (n == 0 || m == 0 || n > 10000 || m > 10000) {        return 0;    }    vector<int> A;    vector<int> B;    for (int i = 0; i<n; i++) {        int mid;        cin >> mid;        A.push_back(mid);    }    for (int i = 0; i < m; i++) {        int mid;        cin >> mid;        B.push_back(mid);    }    vector<int> ans = Merge(A, B);    int len = ans.size();    for (int i = 0; i < len; i++) {        if (i == len - 1) {            cout << ans[i];        }        else {            cout << ans[i] << " ";        }    }    return 0;}