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

Java codingbat帮助-withoutString

汪鸿波
2023-03-14

我在用编码棒。com来进行一些java实践。字符串问题之一“withoutString”如下所示:

给定两个字符串,基字符串和删除字符串,返回基字符串的一个版本,其中删除字符串的所有实例都已删除(不区分大小写)。您可以假设删除字符串的长度为1或更大。只删除不重叠的实例,因此删除“xx”后留下“x”。这个问题可以在:http://codingbat.com/prob/p192570

从下面的dropbox链接屏幕截图中可以看到,除了三次和最后一次“其他测试”之外,所有的测试都通过了问题是,即使它们被标记为不正确,我的输出与正确答案的预期输出完全匹配。

这是我输出的截图:

这是我使用的代码:

public String withoutString(String base, String remove) { 
  String result = "";
  int i = 0;

  for(; i < base.length()-remove.length();){
    if(!(base.substring(i,i+remove.length()).equalsIgnoreCase(remove))){
      result = result + base.substring(i,i+1);
      i++;
    }
    else{
      i = i + remove.length();
    }
    if(result.startsWith(" ")) result = result.substring(1);
    if(result.endsWith(" ") && base.substring(i,i+1).equals(" ")) result = result.substring(0,result.length()-1); 
  }
  if(base.length()-i <= remove.length() && !(base.substring(i).equalsIgnoreCase(remove))){
      result = result + base.substring(i);
  }
  return result;
}

共有3个答案

郎鹤龄
2023-03-14

请在下面找到我的解决方案

public String withoutString(String base, String remove) {
   final int rLen=remove.length();
   final int bLen=base.length();
   String op="";

   for(int i = 0; i < bLen;)
   {
        if(!(i + rLen > bLen) && base.substring(i, i + rLen).equalsIgnoreCase(remove))
        {
            i +=rLen;
            continue;
        }
        op += base.substring(i, i + 1);
        i++;
   }

   return op;   

}

编码时有些事情会变得很奇怪,这只是其中之一。

姜华翰
2023-03-14

我刚刚在IDE中运行了你的代码。它正确编译并匹配codingbat上显示的所有测试。codingbat的测试用例肯定有一些bug。

如果您感到好奇,只需一行代码即可解决此问题:

public String withoutString(String base, String remove) {
     return base.replaceAll("(?i)" + remove, ""); //String#replaceAll(String, String) with case insensitive regex.
}

正则表达式解释:

String#replace eAll(String, String)采用的第一个参数是所谓的正则表达式或简称正则表达式。

正则表达式是在字符串中执行模式匹配的强大工具。在这种情况下,使用的正则表达式是(假设remove等于is):

(?i)是

这个特殊的表达式有两部分:(?i)

IS与字符串"IS"完全匹配,不多不少。

(?i)只是一个指示正则表达式引擎忽略大小写的标志。

使用(?i)IS,所有:ISISISIS都将匹配。

另外,这(几乎)等同于正则表达式:(is | is | is | is)(I | I)(S)[Ii][Ss]

编辑

结果表明您的输出不正确,并且按预期失败。见:dansalmo的答案。

谷善
2023-03-14

您的解决方案失败,并且编码bat时存在显示错误。

正确的输出应该是:

 withoutString("This is a FISH", "IS") -> "Th  a FH"

你的是:

 withoutString("This is a FISH", "IS") -> "Th a FH"

您的失败是因为它正在删除空格,而且,由于超文本标记语言删除了额外的空格,编码蝙蝠不会显示正确的预期和运行输出字符串。

此递归解决方案通过了所有测试:

public String withoutString(String base, String remove) {
    int remIdx = base.toLowerCase().indexOf(remove.toLowerCase());
    if (remIdx == -1)
        return base;
    return base.substring(0, remIdx ) + 
           withoutString(base.substring(remIdx + remove.length()) , remove);
}

下面是一个最佳迭代解决方案的示例。它比递归解决方案有更多的代码,但速度更快,因为进行的函数调用要少得多。

public String withoutString(String base, String remove) {
    int remIdx = 0;
    int remLen = remove.length();
    remove = remove.toLowerCase();
    while (true) {
        remIdx = base.toLowerCase().indexOf(remove);
        if (remIdx == -1)
            break;
        base = base.substring(0, remIdx) + base.substring(remIdx + remLen);
    }
    return base; 
}
 类似资料:
  • 记住命令,特别是命令的用法挺难,不同的命令都有各自的可以使用的参数。一般的命令都支持 --help 参数,它会为你显示命令的帮助信息,比如可用的参数,参数的作用等等。或者也可以使用 man 命令查看命令的帮助手册。 查看帮助,例如看一下 curl 命令的帮助信息: curl --help 返回信息截取: Usage: curl [options...] <url> Options: (H) me

  • Object: JSON JSON解码器和编码器。 JSON Method: encode 转换一个对象或数组为JSON字符串。 语法: var myJSON = JSON.encode(obj); 参数: obj - (object) 转换为字符串的对象。 返回: (string) JSON字符串。 示例: var fruitsJSON = JSON.encode({apple: 'red',

  • 我在一个JPanel中有3个组件,其中GridBagLayout是JPanel的LayoutManager,并在这3个组件上使用GridBagConstraints。 使用当前代码(如下所示),3个元素会正确地出现在面板上。问题是第一个组件是一个JLabel,它有时很长,如果是这样的话,它就会扩展,使其他两个组件变小。 我的目标是拥有一个GridBagLayout为1行4列的JPanel,其中第一

  • 帮助教程 帮助文档        LSV帮助文档详细介绍里产品的使用及操作,极大的方便了用户对的LSV的使用。 点击链接了解详情 视频教程        业内资深人士录制了相关教学视频,不仅对软件进行了介绍,也对行业的相关概念和知识点进行了深入的分析和解释,欢迎大家观看! 点击链接了解详情 博客        LSV的博客里有一系列的关于LSV的FAQ以及一些问题的解决方案,并且可以进行关键词的搜

  • 本文向大家介绍winforms 使用帮助类显示帮助,包括了winforms 使用帮助类显示帮助的使用技巧和注意事项,需要的朋友参考一下

  • 采集帮助: