Codingbat.com上的catDog字符串问题

时间:2010-03-29 19:38:26

标签: java string

有人可以检查我的解决方案吗?

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

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);
}

更新:

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

  2. 更改为i&lt; str.length() - 4给出一个真实的毯子响应 尽管有一些测试字符串 包含不等数量的 “猫”&amp; “狗”代币

  3. 问题的关键在于,当存在可变数量的“猫”时,响应要么都是真的,要么全是假的。各种字符串中的“狗”

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

    中看到

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

14 个答案:

答案 0 :(得分:4)

虽然您非常接近解决方案,但您的代码中存在一些严重问题:

  1. 您对substring()的调用会获取一个大小为2的字符串。该字符串永远不会 catdog。将方法调用中的第二个参数更改为i + 3以获取3个字符。

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

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

  4. 此外,您可以采取一些措施来简化代码:

    1. 确实无需将cat_Count复制到catAnswerdog_CountdogAnswer。扔掉两个变量,并专门使用另一个变量。

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

    3. 在实施修复#1,#2和#3以及建议#1之后,我使用提供的test bench进行了测试运行,结果非常令人满意:

      http://codingbat.com/c2big.jpg全部正确

答案 1 :(得分:1)

int count(String needle, String haystack) {
  return haystack.split(needle, -1).length - 1;
}

public boolean catDog(String str) {
  return count("dog", str) == count("cat", str);
}

这是使用split的“所有正确”解决方案。 -1用于保留尾随空字符串。

答案 2 :(得分:1)

您将要迭代字符串中的每个字符,然后检查子字符串是否等于cat或dog并增加计数。

public boolean catDog(String str) {

  int end = str.length();
  int cDog = 0;
  int cCat = 0;

  // We don't need to go to the end because cat/dog are 3 characters long each. So we can avoid extra checks.
  for (int i=0; i < end-2; i++) {
        if(str.substring(i, i+3).equals("cat")) {
          cCat++;
        } else if(str.substring(i, i+3).equals("dog")) {
          cDog++;
        }  
   }

   return cCat == cDog ? true : false;
}

答案 3 :(得分:0)

1。 如果我使用i + 3我得到一个错误代码异常:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:7(行号:10) - 因此我使用i + 2(没有报告错误 2.改变我&lt; str.length() - 4给出了一个真实的一揽子响应,尽管一些测试字符串包含不等数量的“cat”&amp; “狗”代币

问题的关键在于,尽管存在可变数量的“猫”和“不”,但是响应要么全部都是真的,要么都是假的。各种字符串中的“狗”代币

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

中看到

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

答案 4 :(得分:0)

重复较少的解决方案是编写一个函数来计算字符串中子字符串的出现次数,然后使用字符串和“cat”调用该函数,并使用字符串和“dog”,并返回是否为数量一致。

答案 5 :(得分:0)

public boolean catDog(String str) {
    int cdog = 0;
    int ccat = 0;

    for (int i = 0; i < str.length()-2; i++)
    {
        if (str.charAt(i)== 'c' && str.charAt(i+1)== 'a' && str.charAt(i+2)== 't')
        {
            ccat++;
        }

        else if(str.charAt(i) == 'd' && str.charAt(i+1)== 'o' && str.charAt(i+2)== 'g')
        {
            cdog++;
        }

    }

    if (cdog == ccat)
        return true;

    else
        return false;
}

答案 6 :(得分:0)

public boolean catDog(String str) {
  boolean x =false;  // created a boolean variable.
  int cCount=0;    // variable to count cat in string.
  int dCount=0;    // variable to count dog in string.
  for(int i =0;i<str.length()-2;i++){
    if(str.charAt(i)=='c'&&str.charAt(i+1)=='a'&&str.charAt(i+2)=='t'){ // checking if the string has cat if it does count how many time it has.
      ++cCount;
    }
    if(str.charAt(i)=='d'&&str.charAt(i+1)=='o'&&str.charAt(i+2)=='g'){  // checking if the string has dog if it does count how many time it has.
      ++dCount;
    }
  }
  if(cCount==dCount){  // comparing cat and dog count.
    return true;
  }
  return x;
}

答案 7 :(得分:0)

public boolean catDog(String str) {

  int countcat = 0;
  int countdog = 0;

  if( str.length() >= 3){
  for( int i = 0 ; i < str.length()-2 ; i++){
  if ( str.substring(i,i+3).equals("cat"))
  countcat = countcat + 1;
  }


  for( int j = 0 ; j < str.length()-2 ; j++){
  if ( str.substring(j,j+3).equals("dog"))
  countdog = countdog + 1;
  }}

  if (countdog == countcat )
  return true;


  return false;

}

答案 8 :(得分:0)

public boolean catDog(String str) {
    int cat, dog;
    cat = 0;
    dog = 0;
    for (int i = 0; i < str.length() - 1; i++) {
        if ((i + 3) > str.length()) {
            break;
        }
        if (str.substring(i, i + 3).equals("cat")) {
            cat++;
        }
    }
    for (int i = 0; i < str.length() - 1; i++) {
        if ((i + 3) > str.length()) {
            break;
        }
        if (str.substring(i, i + 3).equals("dog")) {
            dog++;
        }
    }
    if (cat == dog) {
        return true;
    } else
        return false;

}

答案 9 :(得分:0)

这是我的答案。它运作良好。希望如果你被困住会有所帮助。

public boolean catDog(String str) {
  int cat = 0 ;
  int dog = 0 ;
  for(int i  = 0 ; i < str.length()-2; i++){
    String temp = str.substring(i,i+3);
    if(temp.compareTo("cat")==0)
      cat++;
     if(temp.compareTo("dog")==0)
      dog++;
  }
  return cat==dog?true:false;
    
}

答案 10 :(得分:0)

public boolean catDog(String str) {
    int count=0;
    int flag=0;
    for (int i=0; i<str.length()-2; i++)
    {
        if (str.length()>=3&&str.substring(i,i+3).equals("cat"))
            count++;
        if (str.length()>=3&&str.substring(i,i+3).equals("dog"))
            flag++;
    }

    if (count==flag)
        return true;
    else 
       return false;
}

答案 11 :(得分:0)

public boolean catDog(String str) {

  return str.replace("cat","@@").length()==str.replace("dog","&&").length();

}

答案 12 :(得分:0)

我简单的python解决方案:

def cat_dog(str):
  
  cat_sum, dog_sum = 0, 0
  for i in range(len(str)-1):
    if str[i:i+3] == 'cat':
      cat_sum += 1
    elif str[i:i+3] == 'dog':
        dog_sum += 1
  if dog_sum == cat_sum:
    return True
  else:
    return False

答案 13 :(得分:0)

#String-2 > cat_dog(pyton 3)
def cat_dog(str):
    c_c=0
    c_d=0
    for i  in range(len(str)-2):
        if str[i:i+3]=='cat':
            c_c+=1
        if str[i:i+3]== 'dog':
            c_d+=1
    return c_c==c_d