c ++将大数字字符串映射到数字字符串范围

时间:2015-02-19 22:12:10

标签: c++ string optimization range numeric

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

例如,

范围数组[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

我已经使用了#34; long long"数值范围的数据类型和输入也完成了它。但是既然我还要保持性能,有人可以给我一个更好的想法,使得输入值保持字符串以及范围也将保留在字符串中吗?

P.S。:使用" char"我很好指针而不是std :: string。

2 个答案:

答案 0 :(得分:0)

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

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

(注意std::uint64_t 总是是64位无符号整数,所以适用于12位数,但请注意,C ++编译器必然具有支持它;虽然我已经很长一段时间遇到了没有它的人。)

答案 1 :(得分:0)

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

示例:让我们假设您将范围存储在数组number_ranges [10]中,其中number_ranges [0]是第一个范围的下限,number_ranges [1]是下限第二个范围(以及它下面的任何东西仍然在第一个范围内),等等。我们也有一个布尔数组,possible_ranges [10],其中true表示范围仍然可能,而false表示它& #39;不是。由于我们在开始之前没有消除任何东西,所以一切都应该设置为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)
    }
}