Implement atoi to convert a string to an integer.
实现atoi,把一个字符串转换为整数。
Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases.
提示:谨慎思考所有可能的输入情况,如果你想要调整,请不要看下文的提示,向自己提问什么是可能的输入。
Notes: It is intended for this problem to be specified vaguely (ie, no given input specs). You are responsible to gather all the input requirements up front.
注意事项:这个问题制定的很模糊(没有给定输入情况),解题之前,你要搜集所有的输入要求。
解:
需要考虑的情况:
1.知道第一个非空字符,丢弃之前的字符。从这个字符,确定返回值的正负值,如" -123"
,应把之前的空格过滤掉,判断是不是负数。
2.在数字之后,可以有其他类型的字符,这时应忽略之后的字符如:"1234ab34a"
应该忽略"ab34a"
。
3.如果该字符串的首个非空字符,不知构成整数的字符,或者字符都是空格字符,则不进行转换,返回值为0.
4.如果返回的正确值超出int的范围返回INT_MAX或者INT_MIN.
参考代码如下(C++):
class Solution { public: int myAtoi(string str) { long result = 0; bool negative = false; int i = str.find_first_not_of(' '); if (str[i] == '-') negative = true,i++; else if (str[i] == '+') i++; for (int n = i; i - n <= 10 && isdigit(str[i]); i++) result = result * 10 + (str[i]-'0'); if (negative) result = -result; return (result > INT_MAX ? INT_MAX : (result < INT_MIN ? INT_MIN : result)); } };
时间复杂度O(n),空间复杂度O(1).
附:
看到一个极简的代码,用了c++的stringstream 特性,有投机取巧之嫌。
class Solution { public: int myAtoi(string str) { int out = 0; stringstream ss( str ); ss >> out; return out; } };