繁体   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