腾讯笔试题--删除set与vector中QQ号为奇数的号码
2015-09-05 18:58
417 查看
在STL的set和vector容器里存储了1亿个QQ号,编写函数删除奇数QQ号。
解答:
解答:
template<typename T> void Print(T& t) { typename T::iterator it = t.begin(); while (it != t.end()){ cout << *it << " ,"; it++; } cout << endl; } template<typename T> void delete_odd_from_vec(T& vec) { //注意哦,对于vector容器,里面有大量数据,对数据进行erase操作 //效率是很低的,因为为了要连续存储,要移动大量元素,时间开销很大 //所以我们要设计算法,使得每次删除奇数都是在vec容器末尾进行,这样效率就很高啦~~ //设置两个指针,i和j,j始终指向最后一个元素,i指针前面的数经交换后都是偶数,每次, //当末尾不是奇数时,从i位置开始找,找到一个奇数后与末尾数进行交换,当i=j时,说明容器里全是偶数啦~~ //1) 若末尾正好是奇数,则直接vec.pop_back(),删除它; //2) 若末尾不是奇数,则从容器开头开始找到第一个奇数与末尾元素交换,删除末尾交换; //3)重复该过程,直到所有奇数删除 int size = 0; int i = 0, j = vec.size() - 1; while (i < j) { if (vec[j] & 1) { vec.pop_back(); j = vec.size() - 1; continue; } if (vec[i] & 1) { dlong tmp = vec[i]; vec[i] = vec[j]; vec[j] = tmp; vec.pop_back(); j = vec.size() - 1; } else ++i; } } template<typename T> void delete_odd_from_set(T& t) { typename T::iterator it = t.begin(); while (it != t.end()) { if ((*it) & 1) { it = t.erase(it); } else ++it; } } typedef long long dlong; void main() { dlong qq[] = {4,1,907852,14597,3,7,6,9,56,90,45,13,7,111,444,555,666,777,888,999,45,78,65,24,225,78,90,43,1234,5431,}; int len = sizeof(qq) / sizeof(dlong); vector<dlong> qqVec(qq,qq+15); set<dlong> qqSet(qq+15,qq+len); Print(qqVec); delete_odd_from_vec(qqVec); Print(qqVec); cout << endl; Print(qqSet); delete_odd_from_set(qqSet); Print(qqSet); }
相关文章推荐
- hdu 4417 Super Mario(查找区间不大于h的数有多少个)(线段树+二分查找,划分树+二分查找)
- 可能是ThinkPHP导航高亮显示当前页面的最简便的方法(不服来辩哈哈)
- mycncart1.1.0.0 发布
- I/O Stream <傻瓜机器人对话>
- mycncart1.1.0.0 发布
- IIS发布常见错误-HTTP 错误 404.0 - Not-Found
- 用gdb调试core dump文件
- Linux常用帮助命令man,help,info
- 固化分组
- 【JAVASCRIPT】React学习-JSX 语法
- linux任务计划
- Java异常以及处理原则
- iOS的网络基础
- 占有优先量词
- Delphi xe10下载(包含破解补丁和破解视频)
- windows 7 右下角登陆信息去除
- strstr 函数的实现
- ios状态栏隐藏设置
- BAT面试
- 有趣的组合问题