C语言 分享小技巧(一)

C语言 分享小技巧(一)

诶,在刷OJ的时候,会遇到输入一堆数据,找最大值啦,统计字母啦,统计数字啦,统计不辣不辣的

一般来说,我们会建立一个数组,对√,没错,就是建立数组。一说到建立数组就得开辟内存,一说到开辟就想到了,当年五指山下……停停停

开辟了内存,那就是吃?内存了是吧,数据量小了看不出来什么,数据量一大,就可能会出现内存方面的问题了。

咱来品味品味几个??

统计输入的小写字母的数目:
Hello World! 233333

怎么破?可能首先想到的是用gets或者fgets等指令获取单行所有字符,并存入一个字符串数组中,然后呢,一个for循环来统计字符的数目

char str[1000];
int count = 0;
fgets(str, 1000, stdin);    //gets(str);

for (int i = 0; str[i]; i++) {
	if (islower(str[i])) { //判断是否为小写字母
		count++;    //计数器自加
	}
}
printf("%d", count);    //输出结果

这样就可以统计了,很直白。但是呢,可能就会当数据量过大的时候,会出现内存泄漏不啦不啦的。

呐,要咋玩呢?想想,我们输入的数据是不是 :

用户输入    >>    存入数组    >>    遍历一遍    >>    输出结果

看!有一个关键的一步,就是遍历一遍!没错,遍历一遍。

只遍历一遍和用户输入数据完完全全就是同一件事情嘛!获取数据的同时,等于把上一次获取的数据给替换掉,并立马处理数据,统计啦,比较大小啦什么什么的。

来,上?

char ch;
int count = 0;
	
while ((ch = getchar()) != EOF) { //获取数据
	if (islower(ch))count++;    //计数
}
printf("%d", count);    //输出

看!是不是简洁哆啦。而且还不需要数组,一个变量就可以拿来玩了。

 好了,明白了大致的原理,我们就可以来搞♂事♂情了。


例一、

题目描述

输入一个整数n和n个整数,输出这n个整数的最大值。

输入

输入有两行:第一行是一个正整数n,第二行是n个整数。

输出

输出包含一个整数,即n个数中的最大值,单独占一行。

样例输入

4
3 7 5 6

样例输出

7

分析:用“擂台赛的思想”求出最大值

int n;
int max = INT_MIN, t;
scanf("%d", &n);
while (n-->0) {
	scanf("%d", &t);
	if (t > max) max = t;
}
printf("%d", max);

ZZULIOJ 1043: 最大值

例二、

题目描述

小L最近在努力学习英语,但是对一些词组总是记不住,小L小把这些词组中每一个单词的首字母都记一下,这样形成词组的缩写,通过这种方式小L的学习效率明显提高。

输入

测试数据占一行,一个词组,每个词组由一个或多个单词组成;每组的单词个数不超过10个,每个单词由大、小写字母组成;
单词长度不超过10,由一个空格分隔这些单词。 

输出

对应每一个词组,输出词组的缩写,缩写都用大写字母,输出占一行。

样例输入

end of file

样例输出

EOF

分析:要想取出每一个单词的首字符,并转换为大写输出。首先得分析出单词的入口点。

我们可以做一个标记记录是否遇到了空格

当标记为1时,即遇到空格后

在遇到下一个字符时,若不是空格,那么就一定是非空格字符!

有道理吧!(#滑稽

如果只有字母和空格的话,就一定是字母咯。

 

char ch;
int space = 0;
while ((ch = getchar()) != '\n') {
	if (ch == ' ')space = 0;
	else if (space == 0) {
		putchar(toupper(ch));
		space = 1;
	}
}

改编自ZZULIOJ 2401: 小L记单词

 

行了吧,到此为止o(* ̄▽ ̄*)ブ

 

结语:

人可以不够浪,但是代码一定要风骚(→_→)

 

发布了12 篇原创文章 · 获赞 15 · 访问量 3185

猜你喜欢

转载自blog.csdn.net/a1341398182/article/details/88900271