给定两个字符串,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
有人能告诉我为什么会出现这个错误吗?
提前谢谢你。
如果你的参数是“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 ""
此外,请确保问题要求您输入字符,而不是字母。如果它要求字母,那么您应该将两个字符串中的所有字母都用小写或大写进行比较。
最后,您的代码打印对象的问题没有显示在您的代码中。如果您直接打印结果将不会打印任何东西,因为它是一个空字符串。
您是否会考虑使用更直观的方式,例如两层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;
}
您的逻辑中至少有三个错误:
(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。所以,我需要更换的每个实例 有 ,这将有一个非常简单的任务,也 没有一个 转义序列 。 我尝试使用以下代码。 但这给了我以下例外。 我的整个代码,以防万一: 问题答案: 试试这个: 因为反斜杠是正则表达