首页 > 解决方案 > 数字频率程序(HackerRank)

问题描述

我正在尝试将给定字符串的每个字符与数字 0 到 9 进行比较,并在成功比较时增加 count 变量。最后,为每个数字打印 count 变量的值。但这些方法行不通。想不通为什么。

int main() {

    char *s;
    s = malloc(1024 * sizeof(char));
    scanf("%[^\n]", s);

    int i,j,count=0;
    for(i=0;i<=9;i++)
    {   
        for(j=0;j<strlen(s);j++)
        {
            if(s[j]==i)
            {
                count++;
            }
        }
    printf("%d ",count);
    }   
    return 0;
}

标签: carraysstring

解决方案


最后,为每个数字打印 count 变量的值。

所以你需要一个数组来存储每个数字的计数器。奇怪的是,零被排除在计数数字之外。

在这个 if 语句中

if(s[j]==i)

你至少要写

if( s[j] - '0' == i )

而且这个循环

for(i=0;i<=9;i++)

也尝试计算零,尽管你写的是只计算 1-9 的数字。

您的方法效率低下,因为您多次遍历相同的字符数组。而且动态分配字符数组是没有意义的。

该程序可以如下所示

#include <stdio.h>

int main(void) 
{
    enum { M = 9, N = 1024 };
    char s[N];
    s[0] = '\0';

    size_t counter[M] = { 0 };

    fgets( s, N, stdin );

    for ( const char *p = s; *p; ++p )
    {
        if ( '0' < *p && *p <= '9' )
        {
            ++counter[*p - '0' - 1];
        }
    }

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "%zu ", counter[i] );
    }
    putchar( '\n' );

    return 0;
}

例如,如果要输入一个字符串,例如

12345678987654321246897531

那么输出将是

3 3 3 3 3 3 3 3 2 

事实上,字符数组对于这个任务是多余的。此外,它限制了输入的数字序列的长度。您可以在不使用字符数组的情况下编写程序。例如

#include <stdio.h>

int main(void) 
{
    enum { M = 9, N = 1024 };
    size_t counter[M] = { 0 };

    for ( int c; ( c = getchar() ) != EOF && c != '\n'; )
    {
        if ( '0' < c && c <= '9' )
        {
            ++counter[c - '0' - 1];
        }
    }

    for ( size_t i = 0; i < M; i++ )
    {
        printf( "%zu ", counter[i] );
    }
    putchar( '\n' );

    return 0;
}

推荐阅读