【问题标题】:Does the code take constant space in memory for any given input?对于任何给定的输入,代码是否在内存中占用恒定空间?
【发布时间】:2016-10-16 21:19:04
【问题描述】:
public static String switchString(String word, int i, int j) {
    StringBuilder newString = new StringBuilder();
    newString.append(word.substring(j, word.length()));
    newString.append(word.substring(i + 1, j));
    newString.append(word.substring(0, i + 1));
    return newString.toString();
}

对于给定的输入String 和索引ij,代码应该执行如下操作:如果word = “abcdef”i = 1j = 3。输出应该是:“defcab”。

假设单词不是nullij 没有越界,代码工作正常。我想知道对于任何给定长度的字符串,该程序是否通过这种方法在内存中占用恒定空间。

【问题讨论】:

  • 不确定你期望它做什么,但我认为你在newString.append(word.substring(j, word.length())); 得到一个OutOfRange 异常或类似的东西
  • 假设单词不为空并且 i 和 j 不是超出范围的索引,代码工作正常。我想知道对于任何给定长度的字符串,通过这种方法是否需要一个恒定的空间是内存。
  • 关键字:“给定长度”。这意味着您的程序将占用n 内存的一些因素。

标签: java string memory


【解决方案1】:

在 Java 中,Strings 是不可变的。调用substring 会生成一个新的String

如果您的String word 是某个长度n,您最终会生成总长度为n 的子字符串。

无论StringBuilder 的大小是不变的。每个String 中存储的任何元数据也是不变的。变化的是字符串的长度。

因此,不,这种方法不使用常量空间,而是使用n 空间。

【讨论】:

  • 感谢您的回复。你知道我可以用恒定空间解决这个问题的方法吗?
  • 如果您尝试使用可变长度的字符串,那么常量空间是不可行的。 Java 的工作方式会阻止您处理 String word 传递而无需复制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-30
相关资源
最近更新 更多