yinda_peng 发表于 2023-11-21 17:26:28

超简单题目没过,哪里有问题?

本帖最后由 yinda_peng 于 2023-11-21 17:34 编辑



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

int main()
{
char str = {0};
char str1,str2;
scanf("%s",str1);
scanf("%s",str2);
int i=0;
while (str1 != '\0'){
    str[(int)(str1)]++;
    i++;
}
i = 0;
while (str2 != '\0'){
    if ((str[(int)(str2)]--) < 0){
      printf("NO");exit(0);
    }
    i++;
}
printf("YES");

return 0;
}


yinda_peng 发表于 2023-11-21 17:30:20

艹,问题出在<=0,自己排查出来了……

yinda_peng 发表于 2023-11-21 17:32:37

while (str2 != '\0'){
    if ((str[(int)(str2)]--) <= 0){   //<=0
      printf("NO");exit(0);
    }
    i++;
}

isdkz 发表于 2023-11-21 17:26:42

这段代码的问题在于字符计数的部分。在这个循环中,使用了 str[(int)(str1[ i])]++ 来对字符进行计数。然而,这种方法在处理字符时存在一些问题。具体来说,这段代码假设字符的ASCII码是连续的,但实际上并非如此。因此,这种方法不能正确地对字符进行计数。

要解决这个问题,可以使用一个大小为256的整型数组来代替 str 数组,其中每个索引对应一个字符的ASCII码。然后,可以遍历输入的字符串,对应的数组元素加一。这样就可以正确地对字符进行计数了。

修正后的代码如下:

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

int main()
{
char str1, str2;
int count = {0}; // 初始化为0

scanf("%s", str1);
scanf("%s", str2);

for (int i = 0; str1[ i] != '\0'; i++) {
    count[(int)str1[ i]]++;
}

for (int i = 0; str2[ i] != '\0'; i++) {
    if (count[(int)str2[ i]]-- <= 0) {
      printf("NO");
      return 0;
    }
}

printf("YES");

return 0;
}


这样修改后的代码将能够正确地对输入的字符串进行字符计数,并输出正确的结果。

sfqxx 发表于 2023-11-21 18:32:36

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

int main()
{
char str = {0};
char str1,str2;
scanf("%s",str1);
scanf("%s",str2);
int i=0;
while (str1 != '\0'){
    str[(int)(str1)]++;
    i++;
}
i = 0;
while (str2 != '\0'){
    if ((str[(int)(str2)]--) <= 0){
      printf("NO");exit(0);
    }
    i++;
}
printf("YES");

return 0;
}

风眠 发表于 2023-11-21 18:43:39

兄弟,你这是什么IDE啊?

yinda_peng 发表于 2023-11-22 13:15:46

风眠 发表于 2023-11-21 18:43
兄弟,你这是什么IDE啊?

蓝桥题库的

风眠 发表于 2023-11-24 20:21:36

yinda_peng 发表于 2023-11-22 13:15
蓝桥题库的

好的,谢谢
页: [1]
查看完整版本: 超简单题目没过,哪里有问题?