前言

最近学完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算法实现字符串转数字的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

学完java学swift_前言最近学完Swift之后一直没有机会实战,发现由于Swift发展历史原因,目前网上大部分的算法都是使用C、Java或其他语言实现的,几乎没有使用Swift实...相关推荐

  1. 何为python以及python语言的来历及发展历史

    前言 ** 随着信息时代的到来,我们每天都会面对无数信息流的冲击,如何在信息浩瀚的海洋里准确寻找我们所需要的信息提高我们的工作效率使我们不得不考虑的事情. 今天小编就给大家带了解一种适合新手入坑的编程 ...

  2. python和java的区别-Java和Python的区别 学Python语言好还是Java好

    原标题:Java和Python的区别 学Python语言好还是Java好 相信不少想学编程的人都在纠结到底学Java好还是学Python,毕竟当下正是Python的火热时期,然而Java也同样占据编程 ...

  3. python难还是java难-纠结应该先学Python还是Java?看完就有数了

    准备学习编程前,你一定会打开电脑搜索一下"先学Python还是先学Java?"扑面而来的是海量回答.如果你问一名Java程序员,肯定会建议你先学Java,因为他们认为Python像 ...

  4. 最新出炉的Java十大应用领域,学Java好工作找不完

    现阶段很多人被表象迷惑,感觉Java开发人员并不好找工作,或者误以为市场饱和了.其实在我们的身边,不论是手机上还是网站上,随处可见Java的身影,除了人才缺口日益扩大,应用领域也是越来越广泛,今天随动 ...

  5. 刚开始接触Java,学完基础语法之后,应该学什么?

    学完Java寄出语法之后,应该学什么?这是很多初学者在入门学习Java的过程当中比较常见的一个问题,在这里我给大家分享一个系统的Java学习路线: 1.JavaSE:Java基础,既然是基础,那肯定是 ...

  6. Java学完基础语法之后,应该学什么?

    学习Java对于刚刚开始接触的人来说,通常都是比较懵的,计算机语言都很复杂,学习需要系统化,流程化的一步步来.许多人刚刚开始学习Java不知道先学什么?这里可以明确告诉大家,先学基础语法是肯定没错的, ...

  7. java redis管理_优雅时间管理Java轻松做到,想学么?

    原标题:优雅时间管理Java轻松做到,想学么? 来源 |http://rrd.me/gCQHp 前言:需求是这样的,在与第三方对接过程中,对方提供了token进行时效性验证,过一段时间token就会失 ...

  8. java程序员入门先学什么开发者工具

    学习java编程语言,那么开发工具是肯定少不了的,程序员入门基础中开发工具是一定要学会的,可以帮助开发者们提高开发效率.更优雅的写代码.由于开发者涉及的技术领域众多,以后端开发者的视角盘点平时可能用得 ...

  9. 重磅推荐:保姆级Java技术图谱!够学到元宵节了,赶紧收藏!

    最近因为参与社群交流的时间比较多,除了唠唠白酒的嗑之外,很大一部分时间都是看到群里问到一些关于Spring Boot和Spring Cloud应用过程中碰到的问题以及一些开发过程中的报错信息.在这些帮 ...

最新文章

  1. java解码base64的png图片_使用PHP对图片进行base64编码和解码(png、jpg,声音、视频)...
  2. Redis中的发布与订阅
  3. 建模分析师与算法工程师的主要区别
  4. scrapy保存、中断、继续执行爬虫程序
  5. k8s核心技术-Pod(健康检查)_健康检查的方式_以及pod崩溃后如何处理---K8S_Google工作笔记0023
  6. ros control
  7. 使用doctrine的内存耗尽解决办法
  8. 螺旋模型 增量模型_螺旋模型| 软件工程
  9. 无人机——磁力计/电子罗盘 学习及校准
  10. psd.js 解析PSD文件
  11. 洛谷P4707 重返现世 kMAX-MIN反演+DP
  12. 添加源显示未找到使用主机服务器,未能找到主机指定使用服务器
  13. 【Arduino 连接 SD 卡模块实现数据读写】
  14. DBA的工作职责是什么?
  15. Pomodoro Do - 拖延症患者的福音
  16. 海南大学信号与系统838报考高频问题整理
  17. 如何 修改 系统 用户名称 和登陆名称
  18. 面试过后等通知却没回音,到底哪里出了问题?
  19. RK3228H开发之3328芯片手册简单分析
  20. Linux系统的护花使者-----守护进程

热门文章

  1. WPF的自定义控件 依赖属性,DependencyProperty 路由事件RoutedEvent
  2. dm9000 driver 2
  3. 基于 DataLakeAnalytics 做跨地域的数据分析
  4. jenkins 使用LDAP认证
  5. js判断是否是ie浏览器
  6. wpf资源嵌套,一个资源引用另外一个资源,被引用的资源应该声明在前面
  7. 82.开始→运行→输入的命令集锦
  8. [推荐]番茄工作法——专治拖延症、精神涣散、再要五分钟综合症
  9. 干得累死,并不见得老板就待见你?
  10. 50多个强大的jQuery插件应用实例