8. 字符串转整数 (atoi)

一、题目原型:

实现 atoi,将字符串转为整数。
在找到第一个非空字符之前,需要移除掉字符串中的空格字符。如果第一个非空字符是正号或负号,选取该符号,并将其与后面尽可能多的连续的数字组合起来,这部分字符即为整数的值。如果第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
字符串可以在形成整数的字符后面包括多余的字符,这些字符可以被忽略,它们对于函数没有影响。
当字符串中的第一个非空字符序列不是个有效的整数;或字符串为空;或字符串仅包含空白字符时,则不进行转换。
若函数不能执行有效的转换,返回 0。
说明:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。如果数值超过可表示的范围,则返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。

二、题目意思剖析:

输入: "42"
输出: 42

输入: "   -42"
输出: -42
解释: 第一个非空白字符为 '-', 它是一个负号。
     我们尽可能将负号与后面所有连续出现的数字组合起来,最后得到 -42 。

输入: "4193 with words"
输出: 4193
解释: 转换截止于数字 '3' ,因为它的下一个字符不为数字。

输入: "words and 987"
输出: 0
解释: 第一个非空字符是 'w', 但它不是数字或正、负号。
     因此无法执行有效的转换。

输入: "-91283472332"
输出: -2147483648
解释: 数字 "-91283472332" 超过 32 位有符号整数范围。 
     因此返回 INT_MIN (−231) 。

1.第一个非空字符前如果有空格,去掉。
2.第一个非空字符只有三种选项:+ - 数字,否则返回0
3.接下来将连续的数字连接起来,中间不可以有除数字外的其他字符

三、解题思路:

1.创建相应需要的变量

let arr: [String] = ["0","1","2","3","4","5","6","7","8","9"]
var result: Int = 0 // 最终结果
var numbers: [String] = []
for char in str {
    let temp: String = String.init(char)
    numbers.append(temp)
}

2.几个重要的标记

var flag: Int = 1 // 表示最终结果(整数)的符号,默认为1
var space: Int = -1 // 表示当前字符是否为空格,如果不等于-1,就不是空格了。
var valid: Bool = false //表示是否出现了第一个有效的字符(+ - 或者数字)

3.遍历numbers,获取最终结果

 for i in 0.. Int32.max && flag == 1{
             result = Int(Int32.max)
             return result
         }else if result*flag <= Int32.min && flag == -1{
             result = Int(Int32.min)
             return result
         }
     }else {
         break
     }
 }
 return result * flag

4.举例 :“ --0000123”

1.前面的空格会跳过,直到第一个“-”。此时space = i,i = 3,进入下一步
2.此时是“-”,找到了第一个有效的非空字符,valid = true,然后continue
3.接下来是第二个“-”,但是!valid = false,不会进入
if (numbers[i] == "-" || numbers[i] == "+") && !valid{
}
这个判断,会直接到else,会直接break,此时,result = 0

四、小结

8. 字符串转整数 (atoi)_第1张图片
总提交数
8. 字符串转整数 (atoi)_第2张图片
提交结果.png

有其他好的方法请极速留言,非常乐意一起探讨。
个人博客地址

你可能感兴趣的:(8. 字符串转整数 (atoi))