当前位置: 首页 > 知识库问答 >
问题:

给定两个字符串,str1和str2作为输入,删除str1中出现在str2中的所有字符

高自怡
2023-03-14

给定两个字符串,str1和str2作为输入,从str1中删除str2中出现的所有字符。

我的方法

在我的函数中,我使用了2个字符串。在for循环中,我检查每个字符的位置,看string1中的字符是否与string2中的字符匹配。如果不匹配,则增加一个计数。如果匹配,则不递增。我还检查了计数是否与第二根字符串的长度相等。如果是这样,我会将String1字符添加到新字符串中

以下是我今天更新的代码:

 public String remove(String str1, String str2)
{
     String strnew="";
     int count=0;
     int p=0;
     //int j=0;
     int l1=str1.length();
     int l2=str2.length();
     for(int j=0;j<l1;)
     {
        char ch1=str1.charAt(p);
        char ch2=str2.charAt(j);
        if(ch1!=ch2)

        {   
             count++;

             j++;

           if(count==l1)
           {
             strnew=strnew+ch1;
             p++;
             j=0;
             count=0;
            }

        } 

        else
        {
            p++;
            count=0;
            j=0;
        }

     }
    return strnew;
    //write your code here


}       

}

我得到以下错误:

Output       TestcaseParameters Testcase Actual Answer  Expected

No output   'Hello''World'                null             He

有人能告诉我为什么会出现这个错误吗?

提前谢谢你。

共有3个答案

方波娃
2023-03-14

如果你的参数是“Hello”和“World”

原始程序的结果路径如下所示:

String strnew = "";
l1=ch1.length()// l1 = 5
if(ch1!=ch2)   // 'H' != 'W'
   continue;
for(;j<l1;j++) // j = 1
if(ch1!=ch2)   // 'e' != 'W'
   continue;
for(;j<l1;j++) // j = 2
if(ch1!=ch2)   // 'l' != 'W'
   continue;
for(;j<l1;j++) // j = 3
if(ch1!=ch2)   // 'l' != 'W'
   continue;
for(;j<l1;j++) // j = 4
if(ch1!=ch2)   // 'o' != 'W'
   continue;
for(;j<l1;j++) // j = 5, (j < l1) is now false
break;         // (j < l1) being false causes the loop to end
return strnew; // still ""

此外,请确保问题要求您输入字符,而不是字母。如果它要求字母,那么您应该将两个字符串中的所有字母都用小写或大写进行比较。

最后,您的代码打印对象的问题没有显示在您的代码中。如果您直接打印结果将不会打印任何东西,因为它是一个空字符串

羊煜
2023-03-14

您是否会考虑使用更直观的方式,例如两层for循环?请尝试以下代码(我已经测试过):

public String remove(String str1, String str2) {
    String strnew = "";
    int l1 = str1.length();
    int l2 = str2.length();
    for (int j = 0; j < l1; j++) {
        char ch1 = str1.charAt(j);
        boolean isMatched = false;
        for (int p = 0; p < l2; p++) {
            char ch2 = str2.charAt(p);
            if (ch1 == ch2) {
                isMatched = true;
                break;
            }
        }
        if(!isMatched) {
            strnew += ch1;
        }
    }
    return strnew;
}
梁丘烨
2023-03-14

您的逻辑中至少有三个错误:

(1)看起来您正在检查str1,以查看是否有任何字符与str2中的当前字符匹配。您保留不匹配字符的计数。然后,当计数达到限制时,您决定它不匹配并将其添加到结果字符串中。

但是,限制是什么?由于您正在使用str1(使用j),因此限制应为str1中的字符数。但您正在检查计数==l2,l2是str2中的字符数,这是错误的。

碰巧的是,两个测试用例的长度相同,所以这不是这个测试用例失败的原因。但它会导致其他测试用例失败。

(2)更严重的问题是您在哪里进行检查。假设您到达str1的最后一个字符。您发现该字符不匹配。因此,在您修复了第一个问题后,您增加了count,现在它将等于str1的长度。因此程序应该检查count是否等于长度,并相应地执行操作。

但是它没有得到那个检查,因为您将它卡在了ore中。当ch1!=ch2为true时,程序会执行if的正文,然后跳过ore块。结果将是下次它再次通过循环时,j太大,您会得到一个越界异常,显然这个测试器无法优雅地处理([对象对象]?现在真的......)

(3) 还有一个问题是,您的代码将只以一个循环结束。循环条件基于“l1”,循环结束时不重置它。因此,如果找不到与某个字母匹配的字母,循环将在此结束。由于“Hello”不包含任何“W”,因此在检查“str1”中的“W”后,当j和“l1”在第五次迭代中变得相等时,循环将结束。

 类似资料:
  • 描述 (Description) C库函数char *strpbrk(const char *str1, const char *str2)查找字符串str1中与str2指定的任何字符匹配的第一个字符。 这不包括终止空字符。 声明 (Declaration) 以下是strpbrk()函数的声明。 char *strpbrk(const char *str1, const char *str2)

  • 描述 (Description) C库函数int strcoll(const char *str1, const char *str2)将字符串str1与str2进行比较。 结果取决于位置的LC_COLLATE设置。 声明 (Declaration) 以下是strcoll()函数的声明。 int strcoll(const char *str1, const char *str2) 参数 (Pa

  • 描述 (Description) C库函数int strcmp(const char *str1, const char *str2)将str1的字符串与str2 str1的字符串进行比较。 声明 (Declaration) 以下是strcmp()函数的声明。 int strcmp(const char *str1, const char *str2) 参数 (Parameters) str1

  • 描述 (Description) C库函数int strncmp(const char *str1, const char *str2, size_t n)最多比较str1和str2的前n个字节。 声明 (Declaration) 以下是strncmp()函数的声明。 int strncmp(const char *str1, const char *str2, size_t n) 参数 (Pa

  • 描述 (Description) C库函数int memcmp(const void *str1, const void *str2, size_t n))比较存储区str1和存储区str2的前n个字节。 声明 (Declaration) 以下是memcmp()函数的声明。 int memcmp(const void *str1, const void *str2, size_t n) 参数 (

  • 问题内容: 我正在尝试使用JSON从服务器获取对象数组。 服务器向我发送以下字符串。 现在,如果您仔细查看字符串,您会发现它包含一个 而不是every 。该字符串目前无法格式化为JSONArray。所以,我需要更换的每个实例 有 ,这将有一个非常简单的任务,也 没有一个 转义序列 。 我尝试使用以下代码。 但这给了我以下例外。 我的整个代码,以防万一: 问题答案: 试试这个: 因为反斜杠是正则表达