给定两个字符串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
有人能告诉我为什么会收到此错误吗?
提前谢谢。
答案 0 :(得分:4)
您的逻辑中至少有三个错误:
(1)看起来您正在浏览str1
,看看是否有任何字符与str2
中的当前字符匹配。你保留了不匹配的字符数。然后,当计数达到限制时,您确定它不匹配,并将其添加到结果字符串。
但是,限制是什么?由于您正在浏览str1
(使用j
),因此限制应为str1
中的字符数。但是,您正在检查count==l2
,而l2
是str2
中的字符数 - 错误的字符数。
实际上,测试用例的长度都相同,因此这个测试用例失败的原因并不是这样。但它会导致其他测试用例失败。
(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))