京东笔试题:
说是一批订单,包含名字和价格,让实现一个函数按照价格排序
struct Items
{
string name;
int price;
};
bool com(Items a, Items b)
{
return a.price < b.price;
}
int main()
{
Items val;
vector<Items> vec;
for(int i = 0; i < 5; i++)
{
cin>>val.name>>val.price;
vec.push_back(val);
}
sort(vec.begin(), vec.end(),com);
for(int i = 0; i < 5; i++)
cout<<vec[i].name<<" "<<vec[i].price<<endl;
return 0;
}
找出一组数组中前k个最小的数
用排序的话时间复杂度nlgn,用以下方法nlgk
typedef multiset<int,greater<int> > iSet;
typedef multiset<int, greater<int> >::iterator iSetIter; //因为multimap/multiset存在多个相同的键,所以不能和map,set那样直接用下标
void GetLeastNumbers(vector<int>& vec, iSet& LeastNum, int k)
{
LeastNum.clear();
if(vec.size() < k || k < 1)
return;
vector<int>::iterator iter = vec.begin();
for(; iter != vec.end(); iter++)
{
if(LeastNum.size() < k)
LeastNum.insert(*iter);
else
{
iSetIter setIter = LeastNum.begin(); //取出最大值
if(*setIter > *iter) //如果set中最大那个数比当前的数大,则删除并插入当前的新数
{
//LeastNum.erase(*setIter);//不能这样,这样会把键值为*setIter的都删掉
LeastNum.erase(setIter);
LeastNum.insert(*iter);
}
}
}
}
int main()
{
vector<int> vec;
iSet s;
int val;
while(cin>>val)
vec.push_back(val);
int k = 5;
GetLeastNumbers(vec,s,k);
cout<<"输出前"<<k<<"个最小的数:"<<endl;
for(iSetIter iter = s.begin(); iter != s.end(); iter++)
cout<<*iter<<" ";
cout<<endl;
return 0;
}