刷题笔记0x05:字符串数字出现频率统计

>>强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!

鸽了好久没更新,承诺了这周一定要写点,只好掐点时间写shui一篇出来了。

给定一个包含字母和数字的字符串,要求统计出这个字符串中从09的数字的个数。字符串仅包含英文字母与阿拉伯数字,长度1<=len(nums)<=1000
实例输入:
a11472o5t6
输出:
0 2 1 0 1 1 1 1 0 0
这里数字1出现了两次,记为2,而2 4 5 6 7各出现一次,记为1,剩下的0 3 8 9都没有出现,记为0。
在C语言中,对于char类型的变量c表示的数字字符,可以通过进行运算c-'0'来得到其所对应的数字值,这是因为C中字符型的数值运算事实上被隐式转换为了int型。

 1int main() {
2    int* nums = (int*) malloc(10 * sizeof(int));
3    char c;
4
5    for(int i = 0; i < 10; i++)
6        *(nums+i) = 0;
7
8    while(scanf("%c", &c) == 1)
9        if(c >= '0' && c <= '9')
10            (*(nums+(c-'0')))++;
11
12    for(int i = 0; i < 10; i++)
13        printf("%d ", *(nums+i));
14
15    free(nums);
16
17    return 0;
18}

通过malloc获得一个十位的全0列表,同时通过scanf来逐一获取字符串中的字符,并通过ascii码值比较判断是否为数字,,同时将对应位的数字加一。最后则是一个输出过程。当然,由于使用了malloc,所以不能忘记使用free释放这些内存空间。
另外值得一提的是由于free函数仅销毁已经不再需要的内存空间而不对指针做变化,我们剩下的指针将仍然存在直到程序结束,但却指向了垃圾内存,为了避免调用这些指针发生不必要的错误,在实际编程中我们可能需要主动将该指针指向NULL
其实这个有个malloc部分我们完全可以用数组代替。甚至有人使用数组直接一次性读入字符串的方法。

 1char str[1001];
2scanf("%s", str);
3int lut[10] = {0, };
4for (int i = 0; i < strlen(str); ++i) {
5    if (str[i] >= '0' && str[i] <= '9') {
6        ++lut[str[i] - '0'];
7    }
8}
9for (int i = 0; i < 10; ++i) {
10    printf("%d ", lut[i]);
11}

题目说明了字符串最长有1000位,这里使用str[1001],别忘了字符串最后需要一位存放来表示字符串结尾。这段代码相比前者可读性提高了一点。


原文始发于微信公众号(公子政的宅日常):刷题笔记0x05:字符串数字出现频率统计