[英]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
實例(比如one
和other
)具有相同的內容, one.equals(other)
返回false
。 檢查兩個StringBuilder
實例是否相等的一種方法是通過它們的String
表示形式,例如one.toString().equals(other.toString())
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.