Codingbat.com上的catDog字符串问题

sta*_*110 3 java string

谁能检查我的解决方案?

如果字符串“ cat”和“ dog”在给定的字符串中出现相同的次数,我想返回true。有各种字符串,它们的“ cat”和“ dog”数目不同。

public boolean catDog(String str) 
{  
  int catAnswer = 0;
  int dogAnswer = 0;
  int cat_Count = 0;
  int dog_Count = 0;

  for (int i=0; i< str.length()-1; i++) 
  {
    String sub = str.substring(i, i+2);


    if ((sub.equals("cat")))  cat_Count++;
    if ((sub.equals("dog")))  dog_Count++;
    catAnswer = cat_Count; 
    dogAnswer = dog_Count;

  } //end for

  if(dogAnswer == catAnswer ) {return true;}
  // else
  return (dogAnswer != catAnswer);
}
Run Code Online (Sandbox Code Playgroud)

更新:

  1. 如果我使用i + 3,则会收到错误代码Exception:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:7(行号:10)-因此,我使用i + 2(没有错误报告)

  2. 更改为i <str.length()-4可以得到全真响应,尽管某些测试字符串包含不相等数量的“ cat”和“ dog”标记

问题的症结在于,当各种字符串中存在“ cat”和“ dog”的可变数字时,响应要么全为真要么全为假

代码的输出可以在http://codingbat.com/prob/p111624上看到-catDog字符串问题

请尝试剪切和粘贴我的代码以查看输出-这将以图形方式比我能说的解释得更多

Jør*_*ode 5

当您接近解决方案时,您的代码中存在一些关键问题:

  1. 您的调用会substring()获取一个size的字符串2。该字符串永远不能catno dog。更改方法调用中的第二个参数i + 3以获取3字符。

  2. 您对的调用substring()会在输入字符串长度的末尾抛出IndexOutOfRangeExceptioni。确保您不要求一个“溢出”输入字符串长度的子字符串。解决此错误的一种方法是将for循环中的条件表达式更改为i < str.length() - 2

  3. 方法的返回值将始终为true。如果dogAnswer != catAnswer您完全返回该表达式-它将解析为true。可能的解决方案:将两个return语句合并到中return dogAnswer == catAnswer

此外,您可以做一些事情来简化代码:

  1. 真的是没有必要复制cat_CountcatAnswerdog_CountdogAnswer。扔掉两个变量,然后单独使用另一对。

  2. 如果不允许输入字符串包含cat和以外的任何内容dog,则可以优化循环,使其仅考虑输入字符串中的每三个位置。更改i++i += 3(更新:看到CodingBat使用的测试数据后,我可以知道情况并非如此。)

在实施修订#1,#2和#3以及建议#1之后,我使用提供的测试平台进行了测试运行,结果相当令人满意:

全部正确