我在用编码棒。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;
}
请在下面找到我的解决方案
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;
}
编码时有些事情会变得很奇怪,这只是其中之一。
我刚刚在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
,所有:IS
,IS
,IS
和IS
都将匹配。
另外,这(几乎)等同于正则表达式:(is | is | is | is)
,(I | I)(S)
和[Ii][Ss]
。
编辑
结果表明您的输出不正确,并且按预期失败。见:dansalmo的答案。
您的解决方案失败,并且编码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 使用帮助类显示帮助的使用技巧和注意事项,需要的朋友参考一下
采集帮助: