一. 问题
给定一个由 0 到 9 的 n 个数字组成的字符串 S,描述一个将 S 转换成它表示的整数的有效算法。算法的运行时间是多少?
二. 思路
按照题目,我们假设给定字符串为 S = “12345”,可以看出,字符串 S 中含有 5 个字符,那么我们怎么将它们转换成相应整数?先将问题进行简化,不考虑约束条件,比如字符串包含的元素太多,转换成整数以后,有可能溢出之类的问题。就用给定字符串为例,S 转换以后,得到的整数显然是 12345。那么我们按元素的位置进行分解。因为是十进制,所以底数是 10。这样用我们学过的十进制,先将字符串分解,再用对应位置相乘,再将每个结果累加,最后的和就是要求的整数。
三. 代码实现
1 int string_to_int(const string& str) { 2 int result = 0; 3 map<char, int> char_to_num; 4 int i = 0; 5 for (char ch = '0'; ch <= '9'; ++ch) { 6 char_to_num[ch] = i; 7 ++i; 8 } 9 10 for (int j = 0, k = str.size() - 1; j < str.size(); ++j, --k) { 11 int temp_sum = char_to_num[str[j]] * pow(10, k); 12 result += temp_sum; 13 } 14 15 return result; 16 }
(1)代码分析
可以看出,我们传入了一个字符串。在函数中, result 用来保存最终结果。函数中用到了 map,它的作用是将每个字符与整数对应起来,因为我们只需要处理 0 到 9 这 10个字符,所以用 map 进行一一对应。第 5 到 8 行进行了这个操作。接下来,我们对字符串进行分解,再 map 中找到每个字符对应的值,然后进行十进制转换,顺便做累加,执行完以后,得到的结果就是整个字符串对应的整数。
(2)算法正确性证明
算法一开始,将可能会用到的字符作了与数字一一对应的操作,因此不会漏掉任何一个字符。接着对字符串进行分解,当到达字符串结尾的时候,已经将每一个和都计算出来,并且将结果存入了 result 中,所以运算结束以后,最终的结果是就是字符串所对应的整数。不难看出,算法的时间复杂度是 O(n)。