2019-09-29商泰汽车面试手撕STL代码之后知后觉的凉凉夜色

一、问题:使用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]);
}

 

四、编译运行


我当时就想,怎么这么简单的问题?

诶,可结果就是:没把它写得完整,可能面试官跟你面对面交谈想问题真的是太不冷静了。

在此写下人生中的错过和锻炼,真的很值得反思。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值