Swift 算法实现之字符串转数字

971 阅读3分钟

李峰峰博客

总有一天你会为今天的自己感到自豪

一、概述

学完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。当遍历字符串过程中发现了非法字符,则终止后续遍历,并给出提示。

实现代码:

Swift
//字符串转数字
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算法实现之字符串转数字