发布网友 发布时间:2023-10-24 13:07
共5个回答
热心网友 时间:2024-11-30 19:58
写程序首先要明确输入和输出。假设你要求在控制台输入,以回车为结尾;输出一个正整数,表示输入字符串中字符种类数。
设计算法:
读入和输出部分很简单,关键在于处理问题的部分——如何统计。
算法一:建立一个标本数组,然后遍历整个字符串,如果发现不存在标本的字符,将其放入标本,计数器加1。这个算法的时间复杂度n^2,空间复杂度为1。
算法二:算法一中相当一部分时间浪费在检查字符是否有样本这件事情上,对这一步进行改进:样本数组的索引方式改为按ASCII索引。即当前字符为‘a’,只需检查样本数组下标为97的元素是否存在即可。时间复杂度降为n,空间复杂度仍为1,但是占用的空间有所增加。
算法三:将样本数组改成一颗二叉搜索树,每次检查时就可以用二分查找。时间复杂度为nlogn,空间复杂度为1,但是占用的实际空间和一一样多。
算法四:二叉搜索树还可以改成B-树,请自行探索。问题到此为止已经变为一个搜索、添加问题。
从编程实现上考虑,算法一的时空复杂度是最烂的,它的空间复杂度并不会优于算法二, 你在统计之前并不知道种类有多少,所以你只能按最多的情况去申请。算法三虽然的确节省了一些空间,但是这点空间真的不算什么,而且它的时间复杂度可能会退化到一的时间复杂度,写起来也相对麻烦,所以舍弃这种方法。故我推荐选择算法二。
拓展问题:怎样用c语言实现统计一个篇文章中的单词及它们出现的页数。
热心网友 时间:2024-11-30 19:58
#include <stdio.h>
热心网友 时间:2024-11-30 19:59
可以用强制转型:将字符转换成Ascii的值:
0对应的Ascii的是:48
9对应的是:57
if((int)ch>=48&&(int)ch<=57)
热心网友 时间:2024-11-30 20:00
方法很简单,是根据ASCII码表来的,在这个表中0~9的码值是连续的,a~z和A~Z也是连续的,所以判断字符类型就可以根据ASCII的值.热心网友 时间:2024-11-30 20:00
你所有输入的东西,都是字符。