当前位置: 首页 > 面试题库 >

C ++和Java中的字符串连接复杂度

殷德本
2023-03-14
问题内容

考虑这段代码:

public String joinWords(String[] words) {
    String sentence = "";
    for(String w : words) {
        sentence = sentence + w;
    }
    return sentence;
}

在每个串联中,将创建字符串的新副本,因此总体复杂度为O(n^2)。所幸在Java中,我们可以用一个解决这个问题StringBuffer,它具有O(1)为每个附加的复杂性,则整体复杂性会O(n)

在C ++中,std::string::append()具有的复杂度O(n),而我对的复杂性尚不清楚stringstream

在C ++中,是否有类似的方法StringBuffer具有相同的复杂性?


问题答案:

C ++字符串是可变的,几乎与StringBuffer一样可动态调整大小。与Java中的等效语言不同,此代码不会每次都创建一个新字符串。它只是追加到当前的。

std::string joinWords(std::vector<std::string> const &words) {
    std::string result;
    for (auto &word : words) {
        result += word;
    }
    return result;
}

如果您reserve需要预先设置的大小,则会以线性时间运行。问题是,遍历向量以获取大小是否比让字符串自动调整大小要慢。那我不能告诉你。时间。:)

如果std::string由于某种原因不想使用自身(应该考虑;它是一个非常受人尊敬的类),则C ++也具有字符串流。

#include <sstream>
...

std::string joinWords(std::vector<std::string> const &words) {
    std::ostringstream oss;
    for (auto &word : words) {
        oss << word;
    }
    return oss.str();
}

它可能没有比using更加有效std::string,但是在其他情况下则更加灵活-您可以使用它来对任何原始类型以及指定了operator <<(ostream&, its_type&)覆盖的任何类型进行字符串化。



 类似资料:
  • 问题内容: 在Java 6之前,我们在上有一个固定时间的子字符串。在Java 7中,为什么要使用复制数组并降级到线性时间复杂度? 问题答案: 在Oracle错误#4513622中讨论了为什么要做出决定:(str)保留字段的子字符串会阻止对象的GC: 如示例中那样调用String.substring时,未分配用于存储的新字符数组。它使用原始String的字符数组。因此,支持原始字符串的字符数组在子字

  • 问题内容: 为什么在这些情况下输出不同? ==> 印刷:2010年 ==> 打印:200 为什么第一个输出不是30?它与运算符优先级有关吗?就像首先将“ printing”和x连接在一起,然后将结果字符串和y连接在一起?我对么? 问题答案: 它的规则 我在下面显示从高到低的优先顺序: **如果运算符具有相同的优先级 ,* 则 此方法起作用 * 现在 :是字符串” :是Java中唯一将Number连

  • 直到Java6,我们在上有一个常量时间子字符串。在Java7中,为什么他们决定复制数组——并降低线性时间复杂度——而像这样的东西正是为此而准备的?

  • 我有一个非常复杂的字符串,如下所示, 这里所有的JSON数据都在括号“[]”中,括号之间用“{…}”分隔支撑。在这里,我想要一个从所有花括号的消息,故事和属性。尝试了两件事一是二把所有的东西都放在一个JSON对象中,也尝试了一次无用的尝试来匹配regex“message:”但即使这样也没用。 从所有大括号中查找消息、故事和属性的方法是什么。

  • 问题内容: 问题1 在第一种情况下,我知道这是两个字符串文字的串联,因此将对结果“ I Love Java”进行检查,使结果为true。但是,我不确定第二种情况。 问题2 上面的返回false,但是如果我注释掉第1行和第2行,则返回true。这是为什么? 问题答案: 问题的第一部分很简单:Java编译器将多个字符串文字的串联视为一个字符串文字,即 和 是两个完全相同的字符串文字,可以正确地进行in

  • 本文向大家介绍C#程序拆分和连接字符串,包括了C#程序拆分和连接字符串的使用技巧和注意事项,需要的朋友参考一下 要在C#中拆分和连接字符串,请使用and方法。让我们说以下是我们的字符串- 为了分割字符串,我们将使用方法- 现在开始联接,使用方法并联接字符串的其余部分。在这里,我们使用方法跳过了字符串的一部分- 示例 您可以尝试在C#中运行以下代码以拆分和连接字符串。 输出结果