【发布时间】:2010-06-24 12:31:01
【问题描述】:
在给定 CharSequence 的情况下,标准 Java 库中是否有任何工具可以在 O(1) 时间内产生相反的结果?
我想这很容易实现,只是想知道它是否已经存在。 (我怀疑不提供此功能的原因是因为“简单”的方法实际上会破坏多字符代码点 - 但在许多情况下,我们知道我们没有处理这些)。
谢谢
更新 呵呵,大多数人都认为这是“不可能的”,这有点有趣,伙计们!好吧,实际上它(在概念上)是微不足道的——为了清楚起见,pseudojava 如下:
class MyReverseString extends String { //of course I can't extend String!
final String delegate;
MyReverseString(String delegate) { this.delegate = delegate; }
int length() { return delegate.length(); }
int charAt(int i) { return delegate.charAt(delegate.length() - 1 - i); }
}
我将这个问题留待更多时间,只是在极少数情况下,JDK 中已经存在类似显而易见的解决方案(例如,参见 Jon Skeet 的解决方案)并且有人知道它。 (同样,由于那些讨厌的代码点,可能性很小)。
编辑 可能混淆来自于我在标题中有“字符串”(但不是字符串!),而我只要求“CharSequence 的反面”。如果您感到困惑,对不起。我希望 O(1) 部分能够准确地说明所要求的内容。
顺便说一句,this was the question that made me ask this one。 (在这种情况下,从右到左而不是从左到右运行正则表达式会更容易,因此即使对于简单/损坏的代码点实现也可能有一些实用价值)
【问题讨论】:
-
如何在 O(1) 中反转字符串?您必须遍历字符串,对吗?下限肯定是 O(n)?
-
在
O(1)?将显示器旋转 180 度。 -
O(1) 并不意味着在您的代码中,您只需一行代码就可以完成任务,而无需循环......无论如何,StringBuffer() 解决方案似乎在这里最可行。跨度>
-
也许你的意思是 O(1) 空间 - 如果是这样,你会使用 for 循环从 i=0..n/2 循环到从 i=0..n/2 交换字符 i 和长度-i,没有额外的内存已使用,并且更改了原始字符串。