簡體   English   中英

Java 中的 StringBuilder 反向如何工作?

[英]How does StringBuilder reverse work in Java?

我正在嘗試解決這個 leetcode 問題https://leetcode.com/problems/palindrome-linked-list/ ,但遇到了字符串和字符串生成器的問題。 出於某種原因,"12".equals"21" -> 返回 true。

我嘗試從字符串生成器轉換為字符串,並且只使用 stringbuilder。

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。

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

這是一個僅使用2個StringBuilders而不是3個的方法,並且不使用內置的反向方法。 相反,while循環遍歷鏈接列表,將當前節點附加到original StringBuilder,然后將當前節點插入reversed StringBuilder的前面。 因此,內置的insert方法有助於反轉節點值的順序:

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

StringBuilder#reverse就地反轉字符序列,例如

StringBuilder s = new StringBuilder("Hello");
s.reverse();
System.out.println(s); // olleH

要保留原始實例中的字符序列,您需要克隆(創建副本)原始實例並反轉克隆例如

StringBuilder b = new StringBuilder(a).reverse(); // a is the original instance
return a.toString().equals(b.toString());

注意StringBuilder不會覆蓋Object#equals方法,因此即使兩個StringBuilder實例(比如oneother )具有相同的內容, one.equals(other)返回false 檢查兩個StringBuilder實例是否相等的一種方法是通過它們的String表示形式,例如one.toString().equals(other.toString())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM