京东笔试题——集合

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值