37. 字符串转换为整数

一. 问题

给定一个由 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)。

posted @ 2020-08-25 22:39  Hello_Nolan  阅读(536)  评论(0编辑  收藏  举报