在O(1)中反转Java中的字符串?

在给定CharSequence的情况下,标准Java库中是否有任何设施可以在O(1)时间中产生相反的结果?

我想这很容易实现,只是想知道它是否已经存在。(我怀疑未提供此功能的原因是因为“简单”方式实际上会破坏多字符代码点-

但在许多情况下,我们知道我们没有处理这些问题)。

谢谢

嘿,大多数人认为这个“不可能”的好家伙有点可笑!好吧,实际上(从概念上来说)是微不足道的-伪java可以很清楚地说明这一点:

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的解决方案),并且有人对此有所了解。(再次,由于那些讨厌的代码点,这种可能性很小)。

可能是因为我的标题中带有“ string”(而不是String!)引起了混乱,而我只要求“

CharSequence的反向字符”。如果您感到困惑,对不起。我希望O(1)部分能够清楚说明所要的内容。

回答:

好的,您可以轻松地生成一个实现,CharSequence该实现返回相同的长度,当要求输入特定字符时,返回length-

index-1toString()变成O(n)当然…

创建

相反的对象CharSequence将是O(1)-毕竟要做的就是存储对原始的引用CharSequence。显然,对序列中的所有字符进行迭代将是O(n)。

请注意,创建反向CharSequence(根据问题的正文)与创建反向(根据问题的 标题并不

相同。实际生成String是O(n),并且必须是。String __

示例代码,大多数未经测试:

public final class ReverseCharSequence implements CharSequence

{

private final CharSequence original;

public ReverseCharSequence(CharSequence original)

{

this.original = original;

}

public int length()

{

return original.length();

}

public char charAt(int index)

{

return original.charAt(original.length() - index - 1);

}

public CharSequence subSequence(int start, int end)

{

int originalEnd = original.length() - start;

int originalStart = original.length() - end;

return new ReverseCharSequence(

original.subSequence(originalStart, originalEnd));

}

public String toString()

{

return new StringBuilder(this).toString();

}

}

以上是 在O(1)中反转Java中的字符串? 的全部内容, 来源链接: utcz.com/qa/413441.html

回到顶部