Как работает реверс StringBuilder в Java?

Я пытаюсь решить этот вопрос leetcode https://leetcode.com/problems/palindrome-linked-list/ , но возникли проблемы со строками и построителями строк. По какой-то причине "12".equals"21" -> возвращает true.

Я попытался преобразовать из построителя строк в строку и просто использовать построитель строк.

class Solution {
public boolean isPalindrome(ListNode head) {
    StringBuilder s = new StringBuilder();
    while (head != null) {
        s.append(head.val);
        head = head.next;
    }
    String a = s.reverse().toString(); 
    String b = s.toString(); 
    return a.equals(b);
}
}

Он терпит неудачу в тестовом примере «12» и возвращает true.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
1 174
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

StringBuilder reverse не создает новый экземпляр StringBuilder. Это приводит к тому, что базовые символы текущего StringBuilder меняются местами. Так,

String a = s.reverse().toString(); 
String b = s.toString();

Второй s.toString() работает на обратную StringBuilder.

ты должен сделать

String original = s.toString(); 
String reversed = s.reverse().toString();
return original.equals(reversed);

Или просто не используйте здесь StringBuilder и придерживайтесь старых добрых неизменяемых строк. Разница в производительности, скорее всего, не будет иметь значения, если она есть здесь.

Carcigenicate 24.05.2019 05:47

@Carcigenicate Да, если связанный список невелик.

user7 24.05.2019 05:48

Вот один, использующий только 2 StringBuilder вместо 3 и не использующий встроенный реверсивный метод. Вместо этого цикл while проходит через связанный список, добавляет текущий узел в original StringBuilder и вставляет текущий узел перед reversed StringBuilder. Таким образом, встроенный метод вставки помогает изменить порядок значений узлов:

public boolean isPalindrome(ListNode head) {
     StringBuilder original = new StringBuilder(), reversed = new StringBuilder();
     ListNode curr = head;
     while (curr != null) {
         original.append(curr.val);
         reversed.insert(0, curr.val);
         curr = curr.next;
     }
     return original.toString().equals(reversed.toString()) ? true : false;
}

Другие вопросы по теме