1. 程式人生 > 實用技巧 >37. 字串轉換為整數

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)。