Swift算法实现字符串转数字的⽅法⽰例
前⾔
最近学完Swift之后⼀直没有机会实战,发现由于Swift发展历史原因,⽬前⽹上⼤部分的算法都是使⽤C、Java或其他语⾔实现的,⼏乎没有使⽤Swift实现的,所以⾃⼰打算使⽤Swift去实现⼀些主流的算法,既是对⾃⼰Swift的回顾,也是对⾃⼰算法⽅⾯的提⾼。
⾸先是⽤Swift实现字符串转数字,当然,肯定是不能使⽤Swift⾃带的字符串转数字的api。
题⽬:
使⽤Swift实现⼀个⽅法,输⼊字符串,输出该字符串转换成的数字。
例如,输⼊字符串“125”,输出数字125swift 字符串转数组
实现思路及代码
⾸先先考虑可能输⼊情况,包括⾮法输⼊:
情况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算法实现字符串转数字的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,如果有疑问⼤家可以留⾔交流,谢谢⼤家对的⽀持。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论