数组中的元素数

时间:2017-08-23 08:29:44

标签: c arrays

这是关于hackerearth最简单的问题之一,这里是问题陈述:

  

您将获得一个字符串S.计算字符串S中所有数字的出现次数。

但是我无法弄清楚为什么我的解决方案无效,我猜它输入数组有问题,请帮我弄清楚。 (我希望这个解决方案使用数组)。

int i, j;
int digit[10] = {0,1,2,3,4,5,6,7,8,9};
int presence[10] = {0};
int inp[80];
scanf("%s", inp);
for(i = 0; i < strlen(inp); i++) {
    for(j = 0; j < 10; j++) {
       if(inp[i] == digit[j]) {
           presence[j]++;
       }
    }
}
for(i = 0; i < 10; i++) {
    printf("%d\t%d\n",digit[i],presence[i]);
}

3 个答案:

答案 0 :(得分:1)

第一个问题是通过定义

int inp[80];

scanf将数据正确存储在内存中(可能是来自编译器的警告),但inp[i]是由几个字符组成的整数(在整数数据上映射字符的伪造结果)。您必须将字符串存储在char

char inp[80];

第二个问题是比较数字的字符代码与实际数字不匹配。尝试减去'0'的ascii代码:

if(inp[i]-'0' == digit[j]){

也可以在没有digit表的情况下实现,或者通过直接从ASCII代码中推导出数字来实现任何字符串大小和没有双循环:

for(i = 0; i < strlen(inp); i++) {
    if ((inp[i]>='0') && (inp[i]<='9') { 
           presence[inp[i]-'0']++;
    }
}

答案 1 :(得分:1)

如评论中所述,您的数组inp应该是char数组,因为它是一个字符串。

您不需要使用该内循环来测试某个字符是否为数字 - 您可以使用isdigit来测试该字符,然后使用'0'来查找您的数字&# 39;得到了。

当你在循环的每次迭代中计算字符串的长度时,你通过字符串处理的方式效率也非常低。我用char指针替换了它,因为它将指向字符串的开头并继续前进,直到它指向的是终止NUL字符。

int i;
int presence[10] = {0};
char inp[80], *p;

scanf("%s", inp);

for(p = inp; *p; p++) {
    if(isdigit(*p)) {
        presence[*p-'0']++;
    }
}

for(i = 0; i < 10; i++) {
    printf("%d\t%d\n",i,presence[i]);
}

答案 2 :(得分:0)

如果我正确地低估了你想要的东西,下面的代码可能是你的答案:

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

int main(){ 
    int i, j;
    char digit[10] = "0123456789";
    int count[10] = {0,0,0,0,0,0,0,0,0,0};
    char inp[10];

    scanf("%s", inp);
    for(i = 0; i < strlen(inp); i++) {
        for(j = 0; j < strlen(digit); j++) {
            if(inp[i] == digit[j]) {
                count[j]++;
            }
        }
    }
    for(i = 0; i < 10; i++) {
        printf("%d\t%d\n", i, count[i]);
    }
}

inp是你读过的字符串

数字包含所有可能的数字(0到9)

count计算相应位置中所有数字的出现次数。