【剑指offer】NC100 把字符串转换成整数(atoi) [Go语言]

168 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

描述

写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:

  • 若干空格

  • (可选)一个符号字符('+' 或 '-')

  • 数字,字母,符号,空格组成的字符串表达式

  • 若干空格

转换算法如下:
1.去掉无用的前导空格
2.第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
3.判断整数的有效部分:
3.1 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
3.2 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
**3.3  整数超过 32 位有符号整数范围 [−2^31 ,  2^(31− 1)] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −2^31的整数应该被调整为 −2^31 ,大于 2^(31− 1) 的整数应该被调整为 2^(31− 1)
4.去掉无用的后导空格

示例1

输入:

"82"

返回值:

82

示例2

输入:

"   -12  "

返回值:

-12

说明:

去掉前后的空格,为-12  

思路

我们只需要先将前后多余的空格除去,然后按照字节读取,判断是否在0-9之间即可!

AC Code

func StrToInt( s string ) int {
(1)    s = strings.Trim(s," ")
    if len(s)==0{
        return 0
    }
    sign := 1
(2)    if s[0]=='-'{
        sign=-1
        s = s[1:]
(3)    }else if s[0]=='+'{
        s = s[1:]
    }
    s1 := []byte(s)
    res := 0
    for _, v := range s1{
(4)        if v >= '0' && v <= '9' {
(5)            res = res*10+int(v-'0')*sign
            if sign == 1 && res>math.MaxInt32{
(6)                return math.MaxInt32
            }
            if sign == -1 && res < -math.MaxInt32{
(7)                return -math.MaxInt32-1
            }
        } else {
            break
        }
    }
    return res
}
  • (1) 删除前后多余的空格
  • (2) 如果第一位是-那么就做个标志,标志符号位为-1,再删去这个元素
  • (3) 如果第一位是+,那么就直接删去
  • (4) 如果这个v是在0到9之间的话
  • (5) 结果就等于不断递增的res加上这个值
  • (6) 如果超过了最大值,就直接return最大的int32的值
  • (7) 否则就返回-的int32