描述

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

  1. 若干空格
  2. (可选)一个符号字符('+' 或 '-')
  3. 数字,字母,符号,空格组成的字符串表达式
  4. 若干空格

转换算法如下:

  • 去掉无用的前导空格
  • 第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
  • 判断整数的有效部分:

    • 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
    • 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
    • 整数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1
  • 去掉无用的后导空格

数据范围:

  1. 0 <=字符串长度<= 100
  2. 字符串由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成
示例
// 输入:
"82"
// 返回值:
82

// 输入:
"   -12  "
// 返回值:
-12
// 说明:去掉前后的空格,为-12

// 输入:
"4396 clearlove"
// 返回值:
4396
// 说明:6后面的字符不属于有效的整数部分,去除,但是返回前面提取的有效部分

// 输入:
"clearlove 4396"
// 返回值:
0

// 输入:
"-987654321111"
// 返回值:
-2147483648
解题思路
  • 去掉前后空格
  • 处理符号位
  • 判断整数有效部分
  • 结果数据范围判断
代码实现
/**
 * [JZ67-中等] 把字符串转换成整数(atoi)
 *
 * @param s string字符串
 * @return int整型
 */
func strToInt(s string) int {
    // 去掉前后空格
    s = strings.Trim(s, " ")
    if len(s) == 0 {
        return 0
    }

    // 处理符号位
    sign := 1
    if s[0] == '-' {
        sign = -1
        s = s[1:]
    } else if s[0] == '+' {
        s = s[1:]
    }

    // 判断整数有效部分
    res := 0
    for _, v := range s {
        // 数据范围
        if v >= '0' && v <= '9' {
            // 将符合条件的整数字符串转化后加入的结果整数中
            res = res*10 + int(v-'0')
        } else {
            break
        }
        if res > int(math.Pow(2, 31)) {
            break
        }
    }
    // 乘以符号位
    res = int(sign) * res

    // 数据范围判断
    if res > int(math.Pow(2, 31)-1) {
        return int(math.Pow(2, 31) - 1)
    }
    if res < int(0-math.Pow(2, 31)) {
        return int(0 - math.Pow(2, 31))
    }

    return int(res)
}

本文由 一切随风 创作,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论