c - 数字频率程序(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;
}
解决方案
最后,为每个数字打印 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;
}
推荐阅读
- javascript - 获取请求失败,状态为 403:snack.expo.io 上未定义
- python - 如何使用交互式图表将 jupyter notebook 导出为 html?
- php - PHP - htmlentities - 捷克语问题
- python-3.x - 我可以使用存储在 Docker 映像内的 GCS 存储桶中的 Python 模块吗?
- django - 翻译 django-allauth
- css - Bootstrap 是否默认添加水平间距?如果是这样,有没有办法覆盖这个设置?
- swift - 未设置初始大小时,RPSystemBroadcastPickerView 子视图的奇怪行为
- java - 优化:种植小麦和水稻
- mysql - MySQL 数据库迁移到新服务器
- django - 一对多关系现实生活示例