[英]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.