这是关于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]);
}
答案 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计算相应位置中所有数字的出现次数。