时间:2021-05-02
前言
最近学完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。当遍历字符串过程中发现了非法字符,则终止后续遍历,并给出提示。
实现代码:
? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 //字符串转数字 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算法实现字符串转数字的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:http://www.imlifengfeng.com/blog/?p=641
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Java实现数组转字符串及字符串转数组的方法。分享给大家供大家参考,具体如下:字符串转数组使用Javasplit()方法split()方法根据匹配
数字转字符串selectcast(123asVARCHAR);字符串转数字selectcast('123'asINTEGER);以此类推,应该也可以转换为其他数
本文实例讲述了C语言字符串原地压缩的实现方法,对于学习字符串操作的算法设计有不错的借鉴价值。分享给大家供大家参考。具体方法如下:字符串原地压缩示例:"eeeee
详解C++中十六进制字符串转数字(数值)主要有两个方法,其实都是对现有函数的使用:方法1:sscanf()函数名:sscanf功能:从字符串格式化输入用法:in
Python字符串转数字importbinasciis='test123456test'str_16=binascii.b2a_hex(s.encode('ut