Java:在o(1)空间和o(n)时间内反转一个String

时间:2018-03-19 03:02:10

标签: java string reverse

在面试资料库中看到这个问题。有办法吗?

我的猜测是,这是一个棘手的问题。由于字符串是不可变的,因此无法在常量空间中执行此操作。

2 个答案:

答案 0 :(得分:2)

反转Java String要比想象的要困难得多。首先,许多程序员认为String是一个字符数组,每个字符为char。但是,尽管名称如此,char与"字符"不同。 Java字符串使用UTF-16编码,因此一些"字符" (用Unicode术语,"代码点")用2 char编码。更糟糕的是,其中一些"字符"实际上是修饰符:字符修改下一个字符(通常是添加重音)。必须将这些对字符视为一个单元,而不是单独反转。

最后,你可能会问为什么反转一个字符串?这是一个人为的问题。在应用程序中没有人需要文本反转,因为反转一些有用的,有意义的文本会产生无用的胡言乱语。

答案 1 :(得分:1)

使用反射怎么样? 像:

import java.lang.reflect.Field;
public class StringReverseTest {
    public static void main(String[] args)
            throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException {
        Class<String> s = String.class;
        Field m = s.getDeclaredField("value");
        m.setAccessible(true);
        String a = "1234567890";
        char[] cs = (char[]) m.get(a);
        for (int i = 0; i < cs.length / 2; i++) {
            char t = cs[i];
            cs[i] = cs[cs.length - 1 - i];
            cs[cs.length - 1 - i] = t;
        }
        System.out.println(a);
    }
}

它将输出0987654321。 但只适用于面试,必须避免使用任何产品代码。