前言
这是一则求助帖,本人接触此题的时间较早,当时也是一直没有亮绿灯无奈搁置了一会,今天重拾起来依然不能通过,五花八门的错误都出现了:运行错误、编译错误、答案错误。网上扒了一些别人的代码又出现新的错误叫做运行超时,总之无计可施了,希望各路大神指点一二。
说在前面:本文给出的所有代码,在DevC++上皆可成功调试运行,并执行正确的信息查找功能。
题目概览
一、题目描述
输入N个学生的信息,然后进行查询。
二、输入
输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
02
03
01
04
样例输入:
5
001 张三 男 19
002 李四 男 20
003 王五 男 18
004 赵六 女 17
005 刘七 女 21
7
003
002
005
004
003
001
006
三、输出
输出M行,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”
样例输出:
003 王五 男 18
002 李四 男 20
005 刘七 女 21
004 赵六 女 17
003 王五 男 18
001 张三 男 19
No Answer!
思路历程与代码
我认为此题本身并不复杂,但一开始为了提高查找的效率,我构建了一个查找表,把学号索引值与数组索引值对应起来。具体来说就是创建一个足够大的整型数组,作为查找表,可将其初始化为全-1,然后在读入学号时,以学号为索引将现在的存储学生信息的数组下标赋值给查找表。后面查找时直接根据输入的学号,找到对应学生信息数组的下标,然后输出即可。
这样处理会产生一个问题,因为显然我在这里把学号当作整型数读取,但输出是以“00X”的格式输出的,当然这里我们可以在输出的时候使用“%03d”的方法加以解决,于是有了下面的代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct student{
int index;
char name[10];
char sex[4];
int age;
};
int main(){
int n,m;
while(scanf("%d",&n)!=EOF){
student stu[n];
int id;
int searchTable[n+10] = {-1};
for(int i=0;i<n;i++){
scanf("%d",&id);
searchTable[id] = i;
stu[i].index = id;
scanf("%s %s %d",stu[i].name,stu[i].sex,&(stu[i].age));
}
scanf("%d",&m);
while((m--)!=0){
scanf("%d",&id);
if(id>0&&id<=n){
int index = searchTable[id];
printf("%03d %s %s %d\n",stu[index].index,stu[index].name,stu[index].sex,stu[index].age);
}else printf("No Answer!\n");
}
}
return 0;
}
然后codeup报错:
我决定采用朴素的方法查找,放弃查找表,这样我就可以用字符串类型存储学号,并原封不动地输出,以为能有些微的进展:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
struct student{
char index[4];
char name[10];
char sex[4];
int age;
};
int main(){
int n,m;
while(scanf("%d",&n)!=EOF){
student stu[n];
for(int i=0;i<n;i++){
scanf("%s %s %s %d",stu[i].index,stu[i].name,stu[i].sex,&(stu[i].age));
}
scanf("%d",&m);
while((m--)!=0){
char id[4];
scanf("%s",id);
bool flag = false;
for(int i=0;i<n;i++){
if(strcmp(id,stu[i].index)==0){
printf("%s %s %s %d\n",stu[i].index,stu[i].name,stu[i].sex,stu[i].age);
flag = true;
break;
}
}
if(!flag) printf("No Answer!\n");
}
}
return 0;
}
然而codeup说你再想想:
我看了网上别人的代码,粘贴过来跑一跑,还是不行,由于它的算法内核跟我一样、输出方式也没什么差别,我无法做出优化。参考博客:起风了的博客
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
struct Students{
char sno[10];
char name[100];
char sex[50];
int age;
}s[1000];
int main()
{
int n,m,i,j;
char str[10];
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++)
scanf("%s %s %s %d",s[i].sno,s[i].name,s[i].sex,&s[i].age);
cin >>m;
for(i=0;i<m;i++){
cin >>str;
for(j=0;j<n;j++)
if(strcmp(str,s[j].sno)==0){
printf("%s %s %s %d\n",s[j].sno,s[j].name,s[j].sex,s[j].age);
break;
}
if(j==n)
printf("No Answer!\n");
}
}
return 0;
}
其实我还走了许多弯路,最开始是按照习惯把查找表以最大容量初始化在了全局空间,然后在main函数里通过memset或fill函数进行初始化的,但是可能是内存超限了,codeup会报运行错误:
codeup数据库存储能力值得称赞~
希望有经验或想法的朋友们在评论区留言交流,感谢您的不吝赐教!