【问题标题】:Java: reverse a String in o (1) space and o (n) timeJava:在 o (1) 空间和 o (n) 时间中反转字符串
【发布时间】:2018-03-19 03:02:10
【问题描述】:

在采访资料库中看到了这个问题。有办法实现吗?

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

【问题讨论】:

  • 你是对的。
  • 它是一个实际的String 对象,还是一个“字符串”?可以将字符数组或 StringBuilder 视为字符串。
  • 你能验证它是一个实际的字符串对象还是字符列表/数组?
  • 这个问题实际上是关于 Java 的吗?
  • 如果您希望Strings 是不可变的,那是不可能的。因为您需要分配第二个String 来实现这一点,这与O(1) 空间冲突。但是,您可以使用反射来操作String,从而有效地使类不可变。不过绝对不会推荐这个,String 内部发生的事情太多可能会中断。

标签: java string reverse


【解决方案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。 但只适用于面试,在任何产品代码中都必须避免。

【讨论】:

  • 很有趣,但绝不会推荐这些。副作用可能太危险了。特别是像散列和内部缓存这样的东西可能会中断。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 2020-01-28
    • 2011-10-02
    • 2015-05-25
    • 2011-08-09
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多