我必须编写一个名为ghostHunters()
的方法,该方法接受 String 作为参数。该方法应确定 String 是否包含单词 boo 。如果 String 包含 boo 但有两个以上 o ,则该方法应返回false
。
到目前为止,我已经设法开发了一些在某些情况下可以正常工作的代码。但是,如果我输入像Bob says boo
这样的 String ,它就不起作用。
有什么建议吗?
public static boolean ghostHunters(String word)
{
word = word.toLowerCase()+ " ";
if(word.contains("boo") && word.length() > 3)
{
word = word.substring(word.indexOf("b"),word.indexOf("b")+4);
for(int i = 0; i < word.length()- 2; i++)
{
if(word.charAt(i) == 'b' && word.charAt(i+1) == 'o'&& word.charAt(i+2) == 'o' && word.charAt(i+3) != 'o')
{
return true;
}
}
word = word.substring(word.indexOf("b"),word.indexOf("b")+4);
}
else if(word.contains("boo"))
return true;
return false;
}
答案 0 :(得分:0)
如果“boo”位于单词的末尾,word.substring(word.indexOf("b"),word.indexOf("b")+4)
将为您提供StringIndexOutOfBoundsException
,因为word.indexOf("b")+2
是字符串的最后一个索引,substring
尝试返回索引为word.indexOf("b")
到word.indexOf("b")+3
的字符。
您必须检查word.indexOf("b")+4 <= word.length()
。
答案 1 :(得分:0)
如果您输入 Bob说boo ,则返回false,因为 Bob 还有 o ,这与两个o一起计算在 boo 这个词中。因此,o的总数变为3,大于2.因此返回false。
答案 2 :(得分:0)
可能效率更高,但它确实有效,因此您可以找出缺少方法的原因。
public static boolean ghostHunters(String s)
{
String str = s.toLowerCase();
int oCount = 0;
if(s.contains("boo"))
{
for (int i = 0; i < s.length(); i++)
{
if(s.charAt(i) == 'o' && ++oCount == 3) return false;
}
return true;
}
else
return false;
}
答案 3 :(得分:0)
public static boolean ghostHunters(String word) {
if (word == null)
return false;
word = word.toLowerCase();
if (word.length() < 3)
return false;
if (!word.contains("boo"))
return false;
else if (word.length() == 3)
return true;
int index = word.indexOf("boo");
if (word.charAt(index+1) != 'o')
return true;
return false;
}
答案 4 :(得分:0)
你可以试试这个解决方案:
public static boolean ghostHunters(String word) {
word = word.toLowerCase() + "";
if (word.contains("boo") && word.length() > 3) {
if (word.contains("booo"))
return false;
else
return true;
} else
return false;
}
它检查字符串在o
之后是否包含两个以上b
,这正是您所需要的。
答案 5 :(得分:0)
你可以使用正则表达式,我认为它更具可读性
public static boolean ghostHunters(String word) {
return word.toLowerCase().matches(".*?boo[^o]*");
}
答案 6 :(得分:0)
public static boolean ghostHunters(String word)
{
word = word.toLowerCase() + " ";
if(word.contains("boo") && word.length() > 3){
if (word.charAt(word.indexOf("boo")+3) == 'o'){
return false;
} else{
return true;
}
}else if(word.contains("boo")){
return true;
}
return false;
}
我对您的代码进行了一些小的更改,它现在似乎正常工作。 我检查了&#34; boo&#34;的索引。 + 3这将是跟随&#34; boo&#34;。超过2个结果是假的,只是&#34; boo&#34;结果是真的。
答案 7 :(得分:0)
使用@camabeh建议的正则表达式。什么是“可读”可能取决于您当前的技能组合,我记得我之前发现regexps 非常高效和非常难以理解。
更简单的解决方案是将输入分成单词,然后只需检查循环中的单词:
public static boolean ghostHunters(String sentence) {
if (sentence == null)
return false;
}
String[] words=sentence.toLowercase().split(" "); // split on word boundaries
for (String word:words) {
if (word.equals("boo")) {
return true;
}
}
// no match
return false;
}
这确保“Bob有胸部”将返回false,但“Bob说boo”是真的,而“Bob错过并说booo”是假的。 (如果你需要接受现实生活中的句子,你可能希望将分割调整为在标签,新行等上分割。)
我建议您说出您的计划,以便揭示您的意图。上面这个例子清楚地表明我们将句子分成单词,然后我们比较单词。
您的原始示例显示了很多内部字符串操作,因此很难理解。我会说它太低了。
来自@camabeh的regexp示例非常简洁,一旦你熟练使用regexp就可以很好地为你服务。对于初学者级别的CS问题,这是一个(可能)过高的解决方案。