问题如下:
问题分析:
1.输入是以EOF结尾,即输入流中可能出现换行符,因此不能直接使用fgets()获取输入字符。
2.输出一个整数表示最大ASCII码出现次数即可,因此我们不需要考虑保存输入流。
解决办法:
METHOD 1:getchar()逐个获取输入字符,比较ASCII码并计数
#include<stdio.h>
int main() {
int count=0;
char currentChar,maxChar=0;
while((currentChar=getchar())!=EOF){
if(currentChar>maxChar){
maxChar=currentChar;
count=1;
}
else if(currentChar==maxChar) count++;
}
printf("%d",count);
return 0;
}
分析解释:
1.因为我们不需要保存输入,所有我们可以在查看输入流的同时计算最大ASCII码字符出现次数,当看完输入流,计数完成。
2.getchar()每获取一个输入字符,就与之前输入字符中所记录的最大ASCII码比较,如果一样大计数加1,更大则计数还原到1并更新最大ASCII码
METHOD 2:虽然fgets()每次读取一行,但可循环使用fgets(),并将每行输入保存到一个缓冲区(数组)中
#include<stdio.h>
#include <string.h>
int main() {
char buffer[1000],maxChar=0,combinedBuffer[10000] = "";
int count=0,sum=0;
//循环多次使用fgets(),并将每行输入保存到一个缓冲区(数组中)
while (fgets(buffer, sizeof(buffer), stdin) != NULL){
for (int i = 0; buffer[i] != '\0'; i++) {
if (buffer[i] == '\n') {
buffer[i] = '\0';
break;
}
}
strcat(combinedBuffer, buffer);
}
//最后再一起对整个输入进行统计
for(int i=0;combinedBuffer[i]!='\0';i++){
if(combinedBuffer[i]>maxChar){
maxChar=combinedBuffer[i];
count=1;
}
else if(combinedBuffer[i]==maxChar) count++;
}
printf("%d",count);
return 0;
}
分析解释:
1.这个方法重点是如何读取多行的输入,通过不断追加保存每行的输入,实现用fgets()读取多行输入的方法,比较容易想到,但方法会消耗空间
总结:
用getchar()的方法不消耗空间,而且时间复杂度更小,但是比较难想,想出这个方法的巧妙之处在于,把握题目的关键是只需要输出最大ASCII码字符出现次数即可,其实并不要求你保存他的输入