标签:另一个 return std 限制 输入 区别 begin 哈希表 写法
来源:https://www.nowcoder.com/practice/0383714a1bb749499050d2e0610418b1
题目:
查找和排序
题目:输入任意(用户,成绩)序列,可以获得成绩从高到低或从低到高的排列,相同成绩
都按先录入排列在前的规则处理。
示例:
jack 70
peter 96
Tom 70
smith 67
从高到低 成绩
peter 96
jack 70
Tom 70
smith 67
从低到高
smith 67
jack 70
Tom 70
peter 96
输入描述:
输入多行,先输入要排序的人的个数,然后输入排序方法0(降序)或者1(升序)再分别输入他们的名字和成绩,以一个空格隔开
输出描述:
按照指定方式输出名字和成绩,名字和成绩之间以一个空格隔开
示例1
输入
3
0
fang 90
yang 50
ning 70
输出
fang 90
ning 70
yang 50
这是我最近刷的第一道题,虽然是比较简单的题,但是收获不少。先放上我的解法吧,当然不是我写的,是我看讨论里一个高票回答的:
#include<bits/stdc++.h>
using namespace std;
int n,method,score[500],myIndex[500];
string name[500];
bool cmpSmall(int i,int j){
return score[i]<score[j];
}
bool cmpBig(int i,int j){
return score[i]>score[j];
}
int main(){
while(cin>>n){
cin>>method;
for(int i=0;i<n;i++){
cin>>name[i]>>score[i];
myIndex[i]=i;
}
if(method==0){
stable_sort(myIndex,myIndex+n,cmpBig);
}
else{
stable_sort(myIndex,myIndex+n,cmpSmall);
}
for(int i=0;i<n;i++){
cout<<name[myIndex[i]]<<" "<<score[myIndex[i]]<<endl;
}
}
return 0;
}
收获如下:
#include<bits/stdc++.h>
using namespace std;
int n,method;
vector<vector<string>*> myHash;
int main(){
for(int i=0;i<101;i++){
myHash.push_back(new vector<string>());
}
int score;
string name;
while(cin>>n){
cin>>method;
for(int i=0;i<n;i++){
cin>>name>>score;
myHash[score]->push_back(name);
name.clear();
}
if(method==0){
for(int i=100;i>=0;i--){
if(!myHash[i]->empty()){
int length=myHash[i]->size();
for(int j=0;j<length;j++){
cout<<myHash[i]->at(j)<<" "<<i<<endl;
}
}
}
}else{
for(int i=0;i<=100;i++){
if(!myHash[i]->empty()){
int length=myHash[i]->size();
for(int j=0;j<length;j++){
cout<<myHash[i]->at(j)<<" "<<i<<endl;
}
}
}
}
for(int i=0;i<101;i++){
myHash[i]->clear();
}
}
return 0;
}
但是它的实际表现不如第一个解法,无论是时间上还是空间上。虽然第一个解法因为有排序,是O(lgn)的,但是使用的都是基本数据类型,也不涉及到对象的动态申请和释放;第二种虽然是O(n)的,但是使用了STL,每次用完还要释放内容,所以相比还是慢一些,当然空间占用更大是必然的了。从编写上来看,也是第一种比较简单,不容易出错,毕竟stable_sort是写好的库函数。
c++ 有一个和Java容易混的地方,就是它的string\list等等首字母都是小写的,这个平常用不是什么问题,但是像OJ这种提示不完全的有时候还是挺坑的
还有一个坑的地方在于,因为用了万能头文件<bits/stdc++.h>,把c++ 的标准库都一股脑导入进来了,就特别容易发生关键字的重复。我个人觉得比较方便的解决办法就是在变量前面加个my,特别是一些看着就比较“标准”的变量名,例如map\index\hash等等
为啥说了这么多c++ 和java的区别,我本人也是对java更熟悉,却还是要用C++,因为我发现像算法OJ还是C++ 适合,一个是写起来简单(Java的import还有语句都是比较复杂的,只是在IDE下写的爽而已),另一个就是速度比较快,并且c++ 格式简单,写一个main就开干,java还要慢悠悠地创建类
注意sort的参数输入的是begin,end,comp.不要把长度输入进去了,end=begin+n
标签:另一个 return std 限制 输入 区别 begin 哈希表 写法
原文地址:https://www.cnblogs.com/jiading/p/12339926.html