为了账号安全,请及时绑定邮箱和手机立即绑定

为什么使用数组而不是字符串可以减少内存消耗和执行时间?

为什么使用数组而不是字符串可以减少内存消耗和执行时间?

慕神8447489 2022-11-30 13:21:19
给定 char 数组形式的字符串。将其修改为所有感叹号符号“!” 被转移到数组的开头,并且所有 ohters 的顺序相同。请编写一个带有单个 char[] 类型参数的方法。关注算法的内存和时间消耗。我收到的反馈:可以使用数组而不是字符串。我在哪里可以找到有关内存的信息?public static String formatString(char[] chars) {    StringBuilder exclamationSymbols = new StringBuilder();    StringBuilder otherSymbols = new StringBuilder();    for (char c : chars) {        if (c == '!') {            exclamationSymbols.append(c);        } else {            otherSymbols.append(c);        }    }    return (exclamationSymbols.toString() + otherSymbols.toString());}
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

您可以使用 achar[]比使用 a 更快地执行此操作,StringBuilder因为:

  • aStringBuilder只是 a 的包装器char[],所以它不可能更快。间接意味着它会更慢。

  • 您确切地知道结果将持续多长时间,因此您可以分配char[]您需要的最小尺寸。使用 a StringBuilder,您可以预先确定它的大小,但是使用两个StringBuilders 则不能完全确定大小,因此您要么必须过度分配长度(例如,使两者的长度都与 相同chars),要么依靠StringBuilder内部调整自身大小(这会更慢比;它使用更多的内存)。

我的想法是使用两个整数指针指向您将在字符串中写入 char 的下一个位置:一个从数组的开头开始,另一个从末尾开始;当您通过输入进行操作时,两个指针将靠得更近。

处理完整个输入后,结果数组中与“结束指针”对应的部分将向后,因此将其反转。

你可以这样做:

char[] newChars = new char[chars.length];

int left = 0;

int right = chars.length;


for (char c : chars) {

  if (c == '!') {

    newChars[left++] = c;

  } else {

    newChars[--right] = c;

  }

}


// Reverse the "otherSymbols".

for (int i = right, j = newChars.length - 1; i < j; ++i, --j) {

  char tmp = newChars[i];

  newChars[i] = newChars[j];

  newChars[j] = tmp;

}


return new String(newChars);


查看完整回答
反对 回复 2022-11-30
  • 1 回答
  • 0 关注
  • 154 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号