Swift算法實現字符串轉數字的方法示例。本站提示廣大學習愛好者:(Swift算法實現字符串轉數字的方法示例)文章只能為提供參考,不一定能成為您想要的結果。以下是Swift算法實現字符串轉數字的方法示例正文
前言
最近學完Swift之後一直沒有機會實戰,發現由於Swift發展歷史原因,目前網上大部分的算法都是使用C、Java或其他語言實現的,幾乎沒有使用Swift實現的,所以自己打算使用Swift去實現一些主流的算法,既是對自己Swift的回顧,也是對自己算法方面的提高。
首先是用Swift實現字符串轉數字,當然,肯定是不能使用Swift自帶的字符串轉數字的api。
題目:
使用Swift實現一個方法,輸入字符串,輸出該字符串轉換成的數字。
例如,輸入字符串“125”,輸出數字125
實現思路及代碼
首先先考慮可能輸入情況,包括非法輸入:
情況1:所有字符均可直接轉換成數字,如”125″
情況2:包含一個或多個正負號,如”-125″、”–+125″
情況3:包含非法字符,如”125lff”
如果是情況1,處理起來將會非常簡單:首先利用ASCII編碼將字符串“125”的每個字符轉換為數字,之後轉換成數字後直接用乘法和加法即可:1*100+2*10+3=123。
但是實際情況並不那麼簡單,由於情況2和情況3的存在,上面直接用乘法和加法肯定不可行的,中間還得加上相應的判斷。最佳的方式是我們直接遍歷字符串中的字符,先假設沒有正負號和非法字符的存在,當遍歷到第一個字符”1″的時候,intStr=1,當遍歷到第二個字符”2″的時候,intStr = intStr*10+2=12,當遍歷到最後一個字符”3″的時候,intStr = intStr*10+3=123。
關於”+”和”-“,只有當它們在字符串的開頭的時候才表示正負,在字符串中間存在就是非法字符。我們可以通過ASCII編碼判斷”+”和”-“(對應的值分別為43和45),設個變量s表示多個”+”和”-“累積之後的正負。最後結果為intStr = s * intStr。當遍歷字符串過程中發現了非法字符,則終止後續遍歷,並給出提示。
實現代碼:
//字符串轉數字 func StrToInt(str:String) -> Int{ //字符串不能為空 guard str.isEmpty == false else { print("字符串不能為空~"); return 0; } var s = 1 var strInt:Int? = nil for characterInt in str.unicodeScalars { //只能包含數字或正負號 let tempStrInt = characterInt.hashValue - "0".unicodeScalars.first!.hashValue guard (tempStrInt <= 9 && tempStrInt >= 0) || (characterInt.hashValue == 43 || characterInt.hashValue == 45) else { print("包含非法字符!"); return 0; } //正負號只能存在於字符串開頭 if characterInt.hashValue == 43 || characterInt.hashValue == 45 { guard strInt == nil else { print("正負號只能存在於字符串開頭!"); return 0; } } //既然走到這一步,說明字符串合法 //判斷正負數 if characterInt.hashValue == 43 || characterInt.hashValue == 45{ s = s * ( 44 - characterInt.hashValue ) }else{ if strInt == nil { strInt = characterInt.hashValue - "0".unicodeScalars.first!.hashValue }else{ //使用溢出運算符&*和&+避免數值過大導致溢出崩潰 strInt = strInt! &* 10 &+ ( characterInt.hashValue - "0".unicodeScalars.first!.hashValue ) } } } var result:Int? = 0 if strInt != nil { result = s * strInt! } return result!; }
在上述實現的算法中:
輸入”125″,輸出125
輸入”+-125″,輸出-125
輸入”1-25″,提示”正負號只能存在於字符串開頭!”
輸入”1m25″,提示”包含非法字符”
總結
以上就是關於Swift算法實現字符串轉數字的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對的支持。