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

时间:2015-11-21 04:34:32

标签: java string

  

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

MYApproach

在我的函数中,我接受2个Strings.In for循环我检查每个字符位置是否string1中的字符匹配string2.If它不匹配我增加一个count.If匹配我不增加。我也检查是否count是我的第二个字符串的长度。如果是,我然后将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
  

有人能告诉我为什么会收到此错误吗?

提前谢谢。

5 个答案:

答案 0 :(得分:4)

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

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

但是,限制是什么?由于您正在浏览str1(使用j),因此限制应为str1中的字符数。但是,您正在检查count==l2,而l2str2中的字符数 - 错误的字符数。

实际上,测试用例的长度都相同,因此这个测试用例失败的原因并不是这样。但它会导致其他测试用例失败。

(2)更严重的问题是你在做检查的地方。假设您到达str1的最后一个字符。你发现这个角色并不匹配。因此,在修复第一个问题后,您将增加count,现在将等于str1的长度。所以该程序应该检查count是否等于长度,并相应地表现。

但它没有进行检查,因为你将其粘贴在else中。当ch1!=ch2为真时,程序将执行if的正文,然后跳过else块。结果是下次再次循环时,j太大了,你会得到一个越界异常,显然这个测试人员无法正常处理({ {1}}?现在真的.....)

(3)还有一个问题是,你的代码只会在一个循环中结束。你的循环条件基于&#39; l1&#39;当循环结束时你没有重置它。因此,如果找不到匹配的字母,那么循环就会结束。因为,&#34;你好&#34;不包含任何&#39; W&#39;循环将在j和&#39; l1&#39;在检查&#39; W&#39;之后,在第五次迭代中变得相等。在&#39; str1&#39;。

答案 1 :(得分:1)

您会考虑使用更直观的方式,例如两层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;
}

答案 2 :(得分:0)

如果您的参数是“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 ""

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

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

答案 3 :(得分:0)

function processStrings(str1, str2) {
    let str1Out="";
    let str2Out="";
    let x1 = str1.length;
    let x2 = str2.length;
    let output=[];

    for(let i=0; i < x1; i++){
        let occr = 0;
        for(let j=0; j < x2; j++){
            if(str1[i] != str2[j]){
                occr = occr+1;
                if(j == x2-1 && occr > 0){
                    str1Out = str1Out.concat(str1[i]);
                }
            }
            else if(str1[i] == str2[j]){
                break;
            }
        }
    }
     console.log(str1Out, 'str1Out');
    for(let i=0; i < x2; i++){
        let occr = 0;
        for(let j=0; j < x1; j++){
            if(str2[i] != str1[j]){
                occr = occr+1;
                if(j == x1-1 && occr > 0){
                    str2Out = str2Out.concat(str2[i]);
                }
            }
            else if(str2[i] == str1[j]){
                break;
            }
        }
    }
    console.log(str2Out, 'str2Out');

}

答案 4 :(得分:-2)

我认为你没有得到任何输出,因为你的第一个if子句。

if(ch1!=ch2)

这个子句的问题是,它不会比较字符的值,而是检查它们在内存中是否具有相同的地址。 要解决您的问题,您应该比较这样的字符:

if(!ch1.equals(ch2))