描述
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。传入的字符串可能有以下部分组成:
- 若干空格
- (可选)一个符号字符('+' 或 '-')
- 数字,字母,符号,空格组成的字符串表达式
- 若干空格
转换算法如下:
- 去掉无用的前导空格
- 第一个非空字符为+或者-号时,作为该整数的正负号,如果没有符号,默认为正数
判断整数的有效部分:
- 确定符号位之后,与之后面尽可能多的连续数字组合起来成为有效整数数字,如果没有有效的整数部分,那么直接返回0
- 将字符串前面的整数部分取出,后面可能会存在存在多余的字符(字母,符号,空格等),这些字符可以被忽略,它们对于函数不应该造成影响
- 整数超过 32 位有符号整数范围 [−231, 231 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231的整数应该被调整为 −231 ,大于 231 − 1 的整数应该被调整为 231 − 1
- 去掉无用的后导空格
数据范围:
- 0 <=字符串长度<= 100
- 字符串由英文字母(大写和小写)、数字(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)
}
你的才华让人瞩目,期待你的更多文章。 https://www.4006400989.com/qyvideo/15310.html
《同学两亿岁》国产剧高清在线免费观看:https://www.jgz518.com/xingkong/30275.html