Проблема со строкой catDog на Codingbat.com - PullRequest
2 голосов
/ 29 марта 2010

Может ли кто-нибудь проверить мое решение?

Я хочу вернуть 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) - следовательно, я использую я + 2 (нет сообщается об ошибках

  2. Изменение на i

Суть проблемы в том, что ответ может быть либо истинным, либо ложным, если в различных строках есть переменные числа "кошка" и "собака"

вывод кода можно увидеть на http://codingbat.com/prob/p111624 - проблема со строкой catDog

Пожалуйста, попробуйте вырезать и вставить мой код, чтобы увидеть результат - это объяснит более наглядно, чем я мог бы сказать

Ответы [ 11 ]

4 голосов
/ 30 марта 2010

Хотя вы довольно близки к решению, в вашем коде есть несколько критических проблем:

  1. Ваш вызов substring() извлекает строку размером 2. Эта строка не может никогда быть cat или dog. Измените второй параметр в вызове метода на i + 3, чтобы получить 3 символов.

  2. Ваш вызов substring() вызовет IndexOutOfRangeException, когда i приближается к концу длины входной строки. Убедитесь, что вы не запрашиваете подстроку, которая «переполняет» длину входной строки. Один из способов исправить эту ошибку - изменить условное выражение в цикле for на i < str.length() - 2.

  3. Возвращаемое значение вашего метода всегда будет true. В случае, когда dogAnswer != catAnswer, вы возвращаете именно это выражение, которое будет преобразовано в true. Возможное решение: объединить два оператора return в return dogAnswer == catAnswer.

Кроме того, есть несколько вещей, которые вы можете сделать, чтобы сделать ваш код проще:

  1. Нет необходимости копировать cat_Count в catAnswer и dog_Count в dogAnswer. Выбросьте две переменные и используйте только другую пару.

  2. Если входная строка не может содержать ничего, кроме cat и dog, ваш цикл можно оптимизировать так, чтобы он учитывал только каждую третью позицию во входной строке. Измените i++ на i += 3. (Обновление: после просмотра тестовых данных, использованных в CodingBat , я могу сказать, что это не так.)

После реализации исправлений № 1, № 2 и № 3, а также предложения № 1 я провел тестовый прогон с использованием предоставленного испытательного стенда , и результат вполне удовлетворительный:

http://codingbat.com/c2big.jpg Все правильно

1 голос
/ 01 августа 2018

Вы захотите перебрать каждый символ в вашей строке, а затем проверить, равна ли подстрока коту или собаке, и увеличивает ли количество.

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;
}
1 голос
/ 30 марта 2010
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 используется для сохранения завершающих пустых строк.

0 голосов
/ 21 ноября 2017
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;
}
0 голосов
/ 31 июля 2017

Вот мой ответ. Это работает хорошо. Надеюсь, это поможет, если вы застряли.

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;
    
}
0 голосов
/ 29 января 2017
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;

}
0 голосов
/ 01 января 2017
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;

}
0 голосов
/ 27 апреля 2016
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;
}
0 голосов
/ 02 февраля 2014
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;
}
0 голосов
/ 30 марта 2010

Решением с меньшим дублированием было бы написать функцию, которая подсчитывает вхождения подстроки в строке, затем вызвать эту функцию со строкой и «cat», а также со строкой и «dog», и вернуть ли два подсчет согласен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...