描述

写一个函数 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)
}

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

11 条评论

  1. 鍗庣撼鍏徃鍚堜綔寮€鎴锋墍闇€鏉愭枡锛熺數璇濆彿鐮?5587291507 寰俊STS5099
    鍗庣撼鍏徃鍚堜綔寮€鎴锋墍闇€鏉愭枡锛熺數璇濆彿鐮?5587291507 寰俊STS5099

    微信电话同步?【——183-88909465—微电同号】?华纳公司客服联系方式?【6011643——183-88909465——-】、?华纳公司直属开户
    华纳公司注册会员流程?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    如何成为华纳公司会员?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳直属会员开户步骤?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳公司会员注册指南?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳总公司会员申请?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳公司会员注册所需材料?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳会员开户流程?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳公司注册会员步骤?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳会员申请流程?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】
    华纳公司会员注册指南?(▲18288362750?《?微信STS5099? 】【╃q 2704132802╃】

  2. ydmauikrfm
    ydmauikrfm

    一路惊喜

  3. xwrlnboiwk
    xwrlnboiwk

    狂暴2资本的惩罚

  4. syokkltueq
    syokkltueq

    我的世界大电影

  5. sezccjcpcc
    sezccjcpcc

    小银幕大电影

  6. zeapdccjiw
    zeapdccjiw

    大毒枭

  7. wfpolbadpm
    wfpolbadpm

    BamBam南希姐妹的故事

  8. acljxrnvxt
    acljxrnvxt

    死亡电压

  9. hszflnmeqw
    hszflnmeqw

    他她他她

  10. iorsqbozhw
    iorsqbozhw

    你的才华让人瞩目,期待你的更多文章。 https://www.4006400989.com/qyvideo/15310.html

  11. acxyqjjiwt
    acxyqjjiwt

    《同学两亿岁》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/30275.html

添加新评论