что может вызвать этот конкретный палиндром логическую ошибку - PullRequest
0 голосов
/ 19 декабря 2018

Следующий метод был написан, чтобы определить, читает ли его параметр String одинаково слева направо и справа налево (так называемый палиндром).У меня проблемы с поиском логической ошибки этого палиндрома.Я считаю, что ошибка в том, что два условия во всем цикле могут повлиять на проверку символов в строке.Пожалуйста, поправьте меня, если я ошибаюсь, чтобы я мог предложить правильное решение.

enter image description here

Это может быть глупым вопросом для многих из вас, но яновичок в программировании на Java, и это письменный вопрос на бумаге, а не реальный код, если это имеет смысл.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Вы можете применить следующие изменения в своем собственном коде.Есть в основном два изменения, которые находятся в вашем состоянии завершения цикла while, то есть i <= j и условии возврата (i >= j)

public static boolean isPalindrome(String S) {
    int i = 0, j = S.length() - 1;
    while (i <= j && S.charAt(i) == S.charAt(j)) {
        i++;
        j--;
    }
    return (i >= j);
}
0 голосов
/ 19 декабря 2018

Ваша логика будет работать только в том случае, если длина входной строки является нечетным числом, то есть 1,3,5 и т. Д. Потому что в случае, если длина четна, я никогда не буду равен j.Пример для строки "abba":

while (i == j && S.charAt(i) == S.charAt(j)) { // i = 0, j = 3
        i++;
        j--;
    }

iteration-2:

while (i <= j && S.charAt(i) == S.charAt(j)) { // i = 1 , j = 2
        i++;
        j--;
    }

iteration-3:

while (i <= j && S.charAt(i) == S.charAt(j)) { // i = 2 , j = 1
            i++;
            j--;
        }

Это в конечном итоге приведет к StringIndexOutOfBoundsException, когдаi достигает отрицательного значения, а j достигает значения, превышающего длину строки.

Попробуйте следующий код:

  static boolean isPalidrome(String s) {
    int i = 0;
    int j = s.length() - 1;

    while( i <= j && s.charAt(i) == s.charAt(j)) {
      i ++;
      j--;
    }
    return i >= j;
  }
0 голосов
/ 19 декабря 2018

ваш код потерпит неудачу, если входная строка будет выглядеть как «zz» или «xxxx», что означает четную длину с теми же символами, поэтому в идеале вы можете попробовать что-то вроде этого:

public static boolean isPal(String str) {
        int start = 0;
        int end = str.length() - 1;
        while (start < end) {
            final char f = str.charAt(start++);
            final char b = str.charAt(end--);
            if (f != b) {
                return false;
            }
        }
        return true;
    }
...