一、问题:使用list或者vector容器,对其中的数据(包括重复数据)进行筛查,找出该容器中第三大的数据并输出。
二、我的思路
1. 由于有很多不确定的重复数据,于是想到要使用两个容器A、B;
2. 容器A中包含源数据,容器B中存放降序且不重复的数据;再利用at()直接输出第三大的数据即可。
3. 对A进行降序排序,容器怎么排?(冒泡、迭代器)
4. 对容器A进行去重并插入至容器B(如何去重?)
三、 实现
#include <iostream>
#include <iterator>
#include <vector>
using namespace std;
void swap(int &a, int &b);
void sort(vector<int> &obj);
int main()
{
vector<int> *src = new vector<int>;//排序容器src
vector<int> *fin = new vector<int>;//去重,并输出第三大的数字容器fin
for(int i = 0; i < 10; i++)
src->push_back(rand()%20+1);//插入一个1-20的随机数
if(src->empty())
{
cout << "插入数据失败" << endl;
exit(-1);
}
cout << "原容器中的数据为:" << endl;
for(vector<int>::iterator it = src->begin(); it != src->end(); it++)
cout << *it << " ";
cout << endl;
//先对原来的数据执行排序(包括重复的数据)
sort(*src);
cout << "原容器排序后的数据为:" << endl;
for(int i = 0; i < src->size(); i++)
cout << src->at(i) << " ";
cout << endl;
for(int i = 0; i < src->size(); i++)//去重
{
//判断最后一个是不是和排好序中的容器遍历值相等,若相等则跳过
if((fin->empty()) || (fin->back() != src->at(i)))
{
fin->push_back(src->at(i));
}
else
{
continue;
}
}
cout << "去重后的数据为:" << endl;
for(int i = 0; i < fin->size(); i++)
cout << fin->at(i) << " ";
cout << endl;
cout << "第三大的数字是:" << fin->at(2) << endl;;
delete src;
delete fin;
return 0;
}
void swap(int & a, int & b)
{
a ^= b;
b ^= a;
a ^= b;
}
void sort(vector<int> &obj)
{
vector<int>::iterator it = obj.begin();
int len = obj.size();
for(int i = 0; i < len - 1; i++)
for(int j = 0; j < len - i - 1; j++)
if((obj[j]) < (obj[j+1]))
swap(obj[j], obj[j+1]);
}
四、编译运行
我当时就想,怎么这么简单的问题?
诶,可结果就是:没把它写得完整,可能面试官跟你面对面交谈想问题真的是太不冷静了。
在此写下人生中的错过和锻炼,真的很值得反思。