算法打卡day3—判断字符种类数

96 阅读1分钟

题目描述

编写一个函数,计算字符串中含有的不同字符的个数。字符在 ASCII 码范围内( 0~127 ,包括 0 和 127 ),换行表示结束符,不算在字符里。不在范围内的不作统计。多个相同的字符只计算一次

例如,对于字符串 abaca 而言,有 a、b、c 三种不同的字符,因此输出 3 。

数据范围: 1 <= n<=500

题目来源

题目来源

输入描述

输入一行没有空格的字符串。

输出描述:

输入字符串 中范围在(0~127,包括0和127)字符的种数。输入:

输入:
abc
输出:
3

输出:

输入:
aaa
输出:
1

思路

利用“以空间换时间”方法,构造长为128的辅助数组count,遍历字符串str将其中所有元素利用强制类型转换转换为int型,并将对应count数组中的元素进行++,最后遍历count数组,不为零元素的个数即为字符串中字符的种数

具体实现

#include <stdio.h>
#include <string.h>
int main() {
    int count[128];     //构造辅助数组
    int i, j, k, num = 0;
    for (i = 0; i < 128; i++)
        count[i] = 0;   //初始化辅助数组
    char str[1000] = {0};
    gets(str);
    for (j = 0; j < strlen(str); j++) {
        count[(int)str[j]]++;
    }
    for (k = 0; k < 128; k++) {
        if (count[k] != 0)
            num++;
    }
    printf("%d", num);
    return 0;
}

时间复杂度

时间复杂度为O(n) 空间复杂度为O(1)

小结

本题较为简单,但切记眼高手低,在获取字符串ASCII值时思考了好一会儿,最终采用了强制类型转换的方法,还可以采用toascii函数:

函数名: toascii

头文件:<ctype.h>

函数原型:  int toascii(int ch); 或者在输出时改为%d形式