【问题标题】:c++ map large numeric string to numeric string rangesc ++将大数字字符串映射到数字字符串范围
【发布时间】:2015-02-19 22:12:10
【问题描述】:

我必须编写一个输入是 12 位数字字符串的 C++ 函数。我必须找到也存储在字符串数组中的范围。

例如,

范围数组[10]:
1 - 111115555522 - 111225555521
2 - 111225555522 - 111335555521
3 - 111335555522 - 111445555521
4 - 111445555522 - 111555555521
5 - 111555555522 - 111665555521
6 - 111665555522 - 111775555521
7 - 111775555522 - 111885555521
8 - 111885555522 - 111995555521
9 - 111995555522 - 112005555521
10- 112005555522 - 113005555521

输入 - 111555512440
输出 - 数字属于范围 - 5

我已经为数值范围和输入使用了“long long”数据类型并完成了它。但是由于我还必须保持性能,有人可以给我一个更好的主意,让输入值保持字符串,并且范围也保持在字符串中吗?

P.S.:我可以使用“char”指针代替 std::string。

【问题讨论】:

  • long long 会比字符串快。

标签: c++ string optimization range numeric


【解决方案1】:

不要使用字符串,除非在转换任何输入数据时。这将比使用整数类型慢几个数量级。相反,请将范围帖子保留在 std::vector<std::uint64_t> 中。

注意您的向量将被排序,请使用std::lower_boundstd::upper_bound 获取可以找到给定数字的范围。这些函数的运算时间为 O(log N),因此速度很快。请仔细阅读这些功能之间的细微差别。

(请注意,std::uint64_t始终是一个 64 位无符号整数,因此适用于 12 位数字,但请注意,C++ 编译器不一定必须支持它;虽然我已经很长时间没有遇到一个不这样做的人了。)

【讨论】:

  • 如果可以,你能写一个例子吗?
【解决方案2】:

执行此操作的一种方法是创建一个 for 循环并从左侧开始遍历字符串,从而消除途中的选项。在您的示例中,前两位数字不会消除任何内容,然后下一位数字会消除范围 10,因为输入大于范围的下限,然后下一位数字会将范围降低到 4 或 5,并且下一个数字确定范围为 5。您通常不必遍历整个字符串,如果您要多次执行此操作,这对性能有好处。 atoi() 函数在将单个数字转换为整数时会派上用场。

示例:假设您将范围存储在数组 number_ranges[10] 中,其中 number_ranges[0] 是第一个范围的下限,number_ranges[1] 是第二个范围的下限(并且低于它的任何东西仍然在第一个范围内)等等。让我们还有一个布尔数组, possible_ranges[10],其中 true 表示一个范围仍然可能,而 false 表示它不是。由于我们在开始之前没有消除任何东西,所以一切都应该设置为 true。现在,我们需要遍历每个字符串,并酌情消除范围。

for (int i = 0; i < (length of input); i++) {
    for (int j = 0; j < (number of ranges, which is ten); i++ {
        if (input[i] is less than number_ranges[j][i], then there is no way we're in that range, so make that range false)
        if (input[i] is greater or equal to number_ranges[j][i], then there is no way we're in the range below it, so make that false)
        if (everything is false but one, you have your answer, so return it)
    }
}

【讨论】:

  • 你的意思是从最左边的数字开始吗?如果可能的话,你能用示例解释一下吗?
  • 好的,我已经添加了一个示例。如果还不够具体,请告诉我。
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 2012-08-21
  • 2021-11-15
  • 2012-01-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-14
  • 2018-07-09
相关资源
最近更新 更多