计算字符串中数字的频率

时间:2018-12-01 18:31:58

标签: c string loops frequency digits

我需要实现一个可以计算字符串中数字位数的函数。因此,对于数字,也对于诸如aD23b之类的东西。如果我可以使其正常运作,它应该看起来像:
输入:0912302
输出:
0:2
1:1
2:2
3:1
4:0
5:0
6:0
7:0
8:0
9:1

在这一点上,我不能编写任何不幸的代码...我的基本思想是:使用循环检查Input中的每个字符,如果是数字,则将其存储在第二个数组中(假设频率)。我的问题是我需要以某种方式将每个字符转换为整数,或者以某种方式能够计算出 通常每个数字都会出现...我希望这可能起作用,但根本不起作用:

我忘了说我是编程的初学者,所以如果您能给我一些提示和解释,我将不胜感激。

void calc_occurrences(int s[], int occurrences[])
{
int i = 0;
    int j;
    int count = 0;
    while (s[i] != '\0') {
        if (isdigit(s[i])) {
            for (j = 0; occurrences[j] != '\0'; j++) {
                occurrences[j] = s[i];
            }
        }
        i++;
        for (j = i + 1; s[j] != '\0'; j++) {
            if (isdigit(s[i]) == isdigit(s[j])) {
                count++;
                occurrences[j] = 0;
            }
        }

        if(occurrences[i] != 0) {
            occurrences[i] = count;
        }
    }
}

3 个答案:

答案 0 :(得分:2)

您可以拥有一个大小为10的整数数组,其中0存储在所有索引中。然后,当发现数字时,可以在相应的索引中递增数字。

例如,当看到“ 0”时,可以执行arr [0] ++;。

此外,您还可以使用isdigit()函数检查字符是否为数字。

答案 1 :(得分:2)

创建一个数组以计算每个相关字符的频率。

类似这样的东西:

#include <stdio.h>

void count_freq(char* str, int freq[10])
{
    int i = 0;
    while(str[i])  // Loop to end of string
    {
        if (str[i] >= '0' && str[i] <= '9') // Check that the character is in range
        {
            ++freq[str[i]-'0'];  // notice the -'0' to get in range 0..9
        }
        ++i;
    }
}

int main(void) {
    int freq[10] = {0};             // Array to count occurence
    char str[] = "0034364hh324h34"; // Input string

    count_freq(str, freq);          // Calculate frequency

    for (int i=0; i < 10; ++i)      // Print result
    {
        printf("%d: %d\n", i, freq[i]);
    }
    return 0;
}

输出:

0: 2
1: 0
2: 1
3: 4
4: 4
5: 0
6: 1
7: 0
8: 0
9: 0

答案 2 :(得分:0)

PS:我知道,我正在回答一个旧帖子,但是我在HackerRank上遇到了一些挑战,并且设法解决了这个几乎确切的问题,以防万一,因为这可能对我有所帮助,因为我在我的计算机上使用了动态分配代码。

/* Problem: hackkerrank.com/challenges/frequency-of-digits-1/problem */

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main(void)
{
    char    *s;
    char    arr;
    int    i;

    i = 0;
    s = (char*)malloc(sizeof(char));
    scanf("%s", s);
    arr = (int*)malloc(10 * sizeof(int));
    while(i < 10)
    {
        *(arr + i) = 0;
        i++;
    }
    i = 0;
    while (i < strlen(s))
    {
        if (*(s + i) >= '0' && *(s + i) <= '9')
        {
            (*(arr + (*(s + i) - '0'))) += 1;

        }
        i++; 
    }
    i = 0;
    while (i < 10)
    {
        printf("%d ", *(arr + i)); // As HackerRank problem wanted the output format.
        // printf("%d: %d\n", i, *(arr + i));  As you wanted it
        i++;
    }
    return (0);
}