目录

  • 3.2 查找元素
    • 问题 A: 统计同成绩学生人数
    • 问题 B: 找x
    • 问题 C: 查找学生信息
    • 问题 D: 查找
    • 问题 E: 学生查询
    • 小结

3.2 查找元素

Codeup Contest ID:100000576

问题 A: 统计同成绩学生人数

题目描述
读入N名学生的成绩,将获得某一给定分数的学生人数输出。
输入
测试输入包含若干测试用例,每个测试用例的格式为

第1行:N
第2行:N名学生的成绩,相邻两数字用一个空格间隔。
第3行:给定分数

当读到N=0时输入结束。其中N不超过1000,成绩分数为(包含)0到100之间的一个整数。
输出
对每个测试用例,将获得给定分数的学生人数输出。
样例输入

4
70 80 90 100
80
3
65 75 85
55
5
60 90 90 90 85
90
0

样例输出

1
0
3

思路
因为成绩是严格按照0~100的,所以我们可以开一个长度为101的数组,下标对应成绩,相应的值对应该成绩的人数,每次给相应的下标值加1,最后输出数组的值即可。
代码

#include<stdio.h>
#include<string.h>
int a[101]={0};
int main(){int n;while(scanf("%d", &n) != EOF){if(n==0) break;for(int i=0;i<n;i++){int x;scanf("%d", &x);a[x] += 1;}int y;scanf("%d", &y);printf("%d\n", a[y]);memset(a, 0, sizeof(a));}return 0;
}

问题 B: 找x

题目描述
输入一个数n,然后输入n个数值各不相同,再输入一个值x,输出这个值在这个数组中的下标(从0开始,若不在数组中则输出-1)。
输入
测试数据有多组,输入n(1<=n<=200),接着输入n个数,然后输入x。
输出
对于每组输入,请输出结果。
样例输入

4
1 2 3 4
3

样例输出

2

思路
这题跟上一题一样,先把输入的数存入数组,然后把要找的数的下标输出即可。
代码

#include<stdio.h>
#include<string.h>
int a[200]={0};
int main(){int n;while(scanf("%d", &n) != EOF){if(n==0) break;for(int i=0;i<n;i++){int x;scanf("%d", &x);a[i] = x;}int y, len;len = 0;scanf("%d", &y);for(int i=0;i<n;i++){if(a[i]==y) printf("%d\n", i);else len++;}if(len==n) printf("-1\n");memset(a, 0, sizeof(a));}return 0;
}

问题 C: 查找学生信息

题目描述
输入N个学生的信息,然后进行查询。
输入
输入的第一行为N,即学生的个数(N<=1000)
接下来的N行包括N个学生的信息,信息格式如下:
01 李江 男 21
02 刘唐 男 23
03 张军 男 19
04 王娜 女 19
然后输入一个M(M<=10000),接下来会有M行,代表M次查询,每行输入一个学号,格式如下:
02
03
01
04
输出
输出M行,每行包括一个对应于查询的学生的信息。
如果没有对应的学生信息,则输出“No Answer!”
样例输入

5
001 张三 男 19
002 李四 男 20
003 王五 男 18
004 赵六 女 17
005 刘七 女 21
7
003
002
005
004
003
001
006

样例输出

003 王五 男 18
002 李四 男 20
005 刘七 女 21
004 赵六 女 17
003 王五 男 18
001 张三 男 19
No Answer!

思路
很显然,要存储多个学生的信息,第一个想到的肯定是结构体数组。先定义一个学生的结构体,包含学号、姓名、性别和年龄,然后把输入的信息存入到数组中。

需要注意的是,这里的M行是一起输入的,而不是输入一行输出一行,所以,需要把M读入的字符串也存在一个数组中(我这里存在了字符串数组里,也就是char的二维数组)。然后通过两层for循环寻找对应的结构体元素就好了(误)。(因为N最大为1000,M最大为10000,所以嵌套循环的话,时间复杂度将达到10^7,会造成时间超限)。至于如何优化,我的方法就是把你输入的学号字符串通过sscanf转换成int型,然后将其作为数组下标直接读取对应的值即可。

但是有个特别坑的地方就是,我们操作的都是字符串(比如把读入的M行字符串赋给字符串数组,或者字符串数组的元素和学生学号之间作比较),是不能直接用赋值运算符=和比较运算符==的,要用strcpy或者strcmp。
代码

#include<stdio.h>
#include<string.h>
struct student{char number[1000];//注意,这里的三个数组最好都开大一点...我一开始就是因为数组开太小了WA了好几次...char name[1000];char sex[1000];int age;
}stu[1001], stuu[1001];
char str[10001][10];
int main(){int n;while(scanf("%d", &n) != EOF){for(int i=1;i<=n;i++){scanf("%s %s %s %d", stuu[i].number, stuu[i].name, stuu[i].sex, &stuu[i].age);}for(int i=1;i<=n;i++){int k;sscanf(stuu[i].number, "%d", &k);stu[k] = stuu[i];}int m, len;scanf("%d", &m);len = 0;while(m--){char temp[10];int buf;scanf("%s", temp);strcpy(str[len], temp);len++;}for(int i=0;i<len;i++){int tmp;sscanf(str[i], "%d", &tmp);//把输入的字符串转换成下标if(tmp>=1&&tmp<=n) printf("%s %s %s %d\n", stu[tmp].number, stu[tmp].name, stu[tmp].sex, stu[tmp].age);else printf("No Answer!\n");}memset(stu, 0, sizeof(stu));memset(stuu, 0, sizeof(stuu));memset(str, 0, sizeof(str));}return 0;
}

问题 D: 查找

题目描述
输入数组长度 n
输入数组 a[1…n]
输入查找个数m
输入查找数字b[1…m]
输出 YES or NO 查找有则YES 否则NO 。
输入
输入有多组数据。
每组输入n,然后输入n个整数,再输入m,然后再输入m个整数(1<=m<=n<=100)。
输出
如果在n个数组中输出YES否则输出NO。
样例输入

6
3 2 5 4 7 8
2
3 6

样例输出

YES
NO

思路
思路是分别把n个整数和m个整数存入两个数组中,因为本题的m、n范围较小,所以这次可以用两层for循环来遍历了……
代码

#include<stdio.h>
#include<string.h>
int a[101];
int b[101];
int main(){int n, m;while(scanf("%d", &n) != EOF){for(int i=0;i<n;i++){int temp;scanf("%d", &temp);a[i] = temp;}scanf("%d", &m);for(int i=0;i<m;i++){int temp;scanf("%d", &temp);b[i] = temp;}for(int i=0;i<m;i++){int count = 0;for(int j=0;j<n;j++){if(b[i]==a[j]){printf("YES\n");break;}else count++;}if(count==n) printf("NO\n");}memset(a, 0, sizeof(a));memset(b, 0, sizeof(b));}return 0;
}

问题 E: 学生查询

题目描述
输入n个学生的信息,每行包括学号、姓名、性别和年龄,每一个属性使用空格分开。最后再输入一学号,将该学号对应的学生信息输出。
输入
测试数据有多组,第一行为样例数m。对于每个样例,第一行为学生人数n(n不超过20),加下来n行每行4个整数分别表示学号、姓名、性别和年龄,最后一行表示查询的学号。
输出
输出m行,每行表示查询的学生信息,格式参见样例。
样例输入

1
4
1 李江 男 21
2 刘唐 男 23
3 张军 男 19
4 王娜 女 19
2

样例输出

2 刘唐 男 23

思路
首先肯定还是定义一个学生的结构体,然后和问题C类似,直接用学号对应数组下标查找的方式查找即可(这题更简单一些,直接定义int型的学号就好了,都不用字符串转整型)。
稍微需要注意一点的是,最好从数组1开始赋值,这样查找也方便。
代码

#include<stdio.h>
#include<string.h>
struct student{int number;char name[1000];char sex[1000];int age;
}stu[100];
int main(){int n, m;scanf("%d", &m);while(m--){scanf("%d", &n);for(int i=1;i<=n;i++){ //从1开始赋值scanf("%d %s %s %d", &stu[i].number, stu[i].name, stu[i].sex, &stu[i].age);}int x;scanf("%d", &x);printf("%d %s %s %d\n", stu[x].number, stu[x].name, stu[x].sex, stu[x].age);}return 0;
}

小结

这一节的题目相对于上一节都比较简单,同时在刷题的过程中我终于学会了怎么把样例输入复制到黑框框里(/ω\)——在网页上复制好了之后直接在黑框框右键就好了,这样子会节省不少时间。

《算法笔记》学习日记——3.2 查找元素相关推荐

  1. 算法笔记学习PAT甲级解题记录

    算法笔记学习记录 2019.06.26 float&&double 推荐全部使用double,注意区分scanf("%lf",&double1);与prin ...

  2. Python数据结构与算法笔记(三):查找问题——列表查找

    列表查找 查找问题介绍 顺序查找 # li-列表 # val-待查找元素 # ind-索引 def linear_search(li,val):for ind,v in enumerate(li):i ...

  3. 数据结构与算法笔记(十二)—— 查找算法(顺序查找、二分法查找)

    搜索是在一个项目集合中找到一个特定项目的算法过程.搜索通常的答案是真的或假的,因为该项目是否存在.搜索的几种常见方法:顺序查找.二分法查找.二叉树查找.哈希查找 一.顺序查找 最基本的查找技术,过程: ...

  4. 【数据结构和算法笔记】线性表的查找(平均查找长度,二分法,判定树)

    查找: 给定一个值k,在含有n个元素的表中找出关键字等于k的元素,若找到,则查找成功,否则,查找失败 查找前首先确定(1)存放数据的数据结构是什么(2)元素是否有序 动态查找表:查找的同时做修改操作( ...

  5. 前端学习日记2-html表单元素

    文本框 <input type="text"> 即表示文本框 并且只能够输入一行 如果要输入多行 使用文本域<textarea></textarea& ...

  6. 算法笔记学习(3)---深度优先搜索(DFS)

    深度优先搜索(DFS) 设想我们现在身处一个巨大的迷宫之中,以当前所在位置为起点,沿着一条路向前走,当碰到岔路口的时候,就选择其中一个岔道口前进.如果选择的这个岔路前方是一条死路,就退回到这个岔道口, ...

  7. 《算法笔记》学习日记——5.2 最大公约数与最小公倍数5.3 分数的四则运算5.4 素数

    目录 5.2 最大公约数与最小公倍数 问题 A: Least Common Multiple 小结 5.3 分数的四则运算 问题 A: 分数矩阵 小结 5.4 素数 问题 A: 素数 问题 B: Pr ...

  8. OpenCV学习笔记(十七):查找并绘制轮廓:findContours(),drawContours(),approxPolyDP()

    OpenCV学习笔记(十七):查找并绘制轮廓:findContours() 1.findContours() 函数 该函数使用Suzuki85算法从二值图像中检索轮廓.轮廓线是一种用于形状分析.目标检 ...

  9. 《算法笔记》学习笔记(1)

    <算法笔记>学习笔记(1) 2021/4/7号 晚上21:36开始学习 第二章 c++/c快速入门 有的时候不要在一个程序中同时使用cout 和 printf 有的时候会出现问题. 头文件 ...

  10. 大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 21

    大话数据结构读书笔记艾提拉总结 查找算法 和排序算法比较好 第1章数据结构绪论 1 第2章算法 17 第3章线性表 41 第4章栈与队列 87 第5章串 123 第6章树 149 第7章图 211 第 ...

最新文章

  1. pchar,pwidechar,pansichar作为返回参数时内存访问错误
  2. 【Android Gradle】安卓应用构建流程 ( 资源文件编译 )
  3. 宏定义define的使用
  4. python编程计算前30项的和_Python 程序员需要知道的 30 个技巧
  5. 为什么有时优盘是只读模式_JS专题之严格模式
  6. Ubuntu ufw防火墙常见命令
  7. elementui中el-upload自定义上传方法中遇到的问题
  8. 有赞BI平台实现原理
  9. 如何理解「朝闻道,夕死可矣」?
  10. win10企业版2016长期服务激活教程
  11. 我用一根网线,控制了整栋楼的网络
  12. 重庆大学计算机学院郭松涛,C.-C.Jay Kuo教授访问重大计算机学院
  13. 推荐系统学习之评测指标
  14. 天然气阶梯是按年还是按月_天然气阶梯价划分时间的节点怎么计算,是以每年为一个单位吗...
  15. 基于采样的路径规划算法总结:RRT-Matlab实现
  16. 游戏窗口模式和全屏模式的区别在哪?
  17. 五绝------送卢兄之某传xiao之都
  18. vue的通信方式有哪些
  19. 博约新媒体大数据中心_聚焦媒体深度融合与大数据 想成主流数据中心不可少...
  20. linux内核启动时添加打印日志并验证的方法

热门文章

  1. android 支付宝沙盒
  2. 操作系统启动过程——启动引导+硬件自检+系统引导+系统加载+系统登录
  3. 非结构化/行号BASIC(Line-Numbered BASIC)编程语言教程(1)——概述
  4. flutter 获取手机设备信息和APP信息
  5. 武汉大学计算机学院自荐书,2019年武汉大学自主招生自荐信范文
  6. Android8.0 屏幕旋转180度
  7. react17 安装​ react-virtualized​ 报错解决办法
  8. Ios 13.1正式版值得更新吗?耗电及部分BUG汇总,看完你就知道了
  9. 用Java连接SQL SERVER数据库 GUI实现查询
  10. 网页打电话发短信写邮件等实现