统计字符串中数字出现频率

8次阅读

共计 965 个字符,预计需要花费 3 分钟才能阅读完成。

给定一个包含字母和数字的字符串,要求统计出这个字符串中从 0 到 9 的数字的个数。字符串仅包含英文字母与阿拉伯数字,长度 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 型。
int main() {
int* nums = (int*) malloc(10 * sizeof(int));
char c;

for(int i = 0; i < 10; i++)
*(nums+i) = 0;

while(scanf(“%c”, &c) == 1)
if(c >= ‘0’ && c <= ‘9’)
(*(nums+(c-‘0’)))++;

for(int i = 0; i < 10; i++)
printf(“%d “, *(nums+i));

free(nums);

return 0;
}
通过 malloc 获得一个十位的全 0 列表,同时通过 scanf 来逐一获取字符串中的字符,并通过 ascii 码值比较判断是否为数字,,同时将对应位的数字加一。最后则是一个输出过程。当然,由于使用了 malloc,所以不能忘记使用 free 释放这些内存空间。另外值得一提的是由于 free 函数仅销毁已经不再需要的内存空间而不对指针做变化,我们剩下的指针将仍然存在直到程序结束,但却指向了垃圾内存,为了避免调用这些指针发生不必要的错误,在实际编程中我们可能需要主动将该指针指向 NULL。其实这个有个 malloc 部分我们完全可以用数组代替。甚至有人使用数组直接一次性读入字符串的方法。
char str[1001];
scanf(“%s”, str);
int lut[10] = {0,};
for (int i = 0; i < strlen(str); ++i) {
if (str[i] >= ‘0’ && str[i] <= ‘9’) {
++lut[str[i] – ‘0’];
}
}
for (int i = 0; i < 10; ++i) {
printf(“%d “, lut[i]);
}
题目说明了字符串最长有 1000 位,这里使用 str[1001],别忘了字符串最后需要一位存放 \0 来表示字符串结尾。这段代码相比前者可读性提高了一点。

正文完
 0