0
点赞
收藏
分享

微信扫一扫

华为2016校园招聘上机笔试题 -- 01

回望这一段人生 2022-04-03 阅读 44
算法

题目描述:

老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩.

输入描述:

每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。
学生ID编号从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩
接下来又M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为'Q'的时候, 表示这是一条询问操作,假设A<B,他询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少
当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。

注意:输入包括多组测试数据

输出描述:

输入例子1:

5 7
1 2 3 4 5
Q 1 5
U 3 6
Q 3 4
Q 4 5
U 4 5
U 2 9
Q 1 5

输出例子1:

5
6
5
9

输入例子2:

3 2
1 2 3
U 2 8
Q 3 1

输出例子2:

8
对于每一次询问操作,在一行里面输出最高成绩.

c代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void swap(int*a,int*b)
{
int c;
c = *a;
*a = *b;
*b = c;
}
int main()
{
int n,m;
int i,j;
int s1,s2;
int temp;
int a[30000];
char ch;
while(scanf("%d%d",&n, EOF) {

for(i=1;i<=n;i++) {
scanf("%d", //录入每个学生的成绩
}

for(i=0;i<m;i++) {
scanf(" %c%d%d",&ch,
if(ch == 'U') {
a[s1] = s2;
}
else if(ch == 'Q') {
if(s1>s2) {
swap(
}
temp = a[s1];
for(j=s1+1;j<=s2;j++) {
if(temp<a[j])
temp = a[j];
}

printf("%d\n",temp);
}
}
}

}

一道看似很简单的题目;竟然花了很久很久的时间才把全部测试用例通过;无语,很无语....

记录一下自己踩的大坑,不过通过这道题目还是学到了一些东西,其实是蛮好的题。

题目的思路:

1、首先读入学生数量n和操作数m

2、用一个数组记录每个学生的成绩a[i]

3、根据学生数量n,循环读入每个学生的成绩

4、根据操作数m的数量,循环对相应的操作进行对应处理即可:

     1>若是U,则直接将相应数组位置的值改为期待的值

     2>若是Q,则将指定区间数组的最大值取出来输出

踩坑点:

1、若输入Q,取出指定区间的最大值;第一个输入值是可能比第二个大的;

    所以我们要进行判断,对应的代码处理段:
 

			if(s1>s2) {
swap(
}

2、scanf的运用问题;

先看如下代码段:

scanf(" %c%d%d",&ch,&s1,&s2);

可以发现scanf(" %c%d%d",&ch,&s1,&s2);%c前面是有空格的!一开始写程序的时候没有加,在本地调试的时候就发现输出一直有问题,本地运行如下:

可以看到 输入U 2 8后就直接结束了;原因如下:
采用%c的时候,是会读取所有字符的;我们在输入每个学生的成绩时,最后一个换行符是还在缓冲区中的;紧接着我们进行scanf("%c");进行读取,读到的就是在缓冲区里的'\n',这样就发生了错误;

解决的方法有两种:

<1>、scanf(" %c%d%d",&ch,&s1,&s2);

%c前加上一个空格;百度到了这样一个解释觉得蛮不错:
控制串、数组钟的空白符使scanf()在输入留中跳过一个或多个空白符(本地试了一下,确实可以跳过多个);空白符可以是空格、制表符(tab)和新行符(newline)。本质上,控制串中的空白符使scanf(),在输入流中读,但不保存结果,直到发现非空白字符为止;

ps:

C标准中空白字符有:空格(‘ ’)、换页(‘\f’)、换行(‘\n’)、回车(‘\r’)、水平制表符(‘\t’)、垂直制表符(‘\v’)六个

<2>、getchar()

        getchar();
scanf("%c%d%d",&ch,

使用getchar()吃掉换行符,用例也是可以通过的;这个就不用多解释了 

3、这道题是可以有多组输入的!

其实在题目中的注意里提到了....所以仔细读题是非常重要的

所以一开始的数据读入要这样写

    while(scanf("%d%d",&n,&m) != EOF) {

总结:题目其实很简单,但是要注意的小细节点挺多

举报

相关推荐

0 条评论