京东笔试题——集合
2017-08-22 20:01
489 查看
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; }
4000
相关文章推荐
- 合并两个整数集合,并排序---京东2017秋招笔试
- 京东2017秋笔试真题--集合
- 【记凡客诚品面试】需要规划的人生,需要专精的技术+京东笔试了。。。
- 京东笔试:括号匹配 ---- 逆向思维题
- 京东2015在线笔试----编程题--分苹果
- 谷歌笔试题--给定一个集合A=[0,1,3,8](该集合中的元素都是在0,9之间的数字,但未必全部包含), 指定任意一个正整数K,请用A中的元素组成一个大于K的最小正整数。
- 网易2017春招笔试真题编程题集合--Python
- 百度2017春招笔试真题编程题集合--Python
- 淘宝、京东等商城,集合到一个网页里
- 华为C语言笔试题集合
- 京东2017实习生招聘在线笔试编程题
- 京东实习笔试——站队
- 牛客网-网易2017春招笔试真题编程题集合-解题思路及源码
- 京东实习笔试——通过考试
- 京东2017实习生笔试编程题-终结者C
- 2016-08-14-京东笔试和面试(Java方向)
- 京东笔试题
- 京东2016笔试题 小东拉票
- 京东2015年应届生招聘笔试题(A)卷答案选择题部分
- 华为C语言笔试题集合