题目: String to Integer (atoi)
Implement atoi to convert a string to an integer.
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.
Update (2015-02-10):
The signature of the C++ function had been updated. If you still see your function signature accepts a const char * argument, please click the reload button to reset your code definition.
题目分析:
- 题目的含义是将一个字符串转化为数字,里面包含各种情况,需要分开进行讨论并最终转化为正确的数字
思路:
- 举例:例如’ ’ 结果是0 ’ 12a89’结果是12 ’ +128gh’结果是128 ’ -78bg90’结果是-78
- 主要分为如下情况:如果字符串开头是空格,那么就将所有的空格都忽略;如果空格过后出现了正号或者是负号,就用标志来记录正负号;如果正负号或者空格过后是数字那么得到的就是数字;如果数字之后出现字母那么就可以直接返回数字了;每次数字都需要判断是否溢出,需要进行溢出处理
代码:
- C++:
//将字符串转化为整型数字 例如' ab12' 这个结果数字是0 ' 12b'结果是12 数字前面只能是空格或者正负号那么这个结果才是数字,否则结果都是0
class Solution {
public:
int myAtoi(string str) {
//如果是空字符串直接返回NULL
if(str.length()==0)
return 0;
int i=0;
while(str[i]!='\0' && str[i]==' ')//如果字符串未到结尾并且前面是空格,忽空格
{
i++;
}
//如果去掉空格后字符串为空了,那么返回0
if(str[i]=='\0')
return 0;
int flag=1;//标志是正号还是负号
long long res=0;//最后的结果数字
//如果出现正负号的处理
if(str[i]=='+')//如果出现的是正号 那么将flag置为1
{
flag=1;
i++;
}
else if(str[i]=='-')//如果出现的是正号 那么将flag置为-1
{
flag=-1;
i++;
}
while(str[i]!='\0')//如果此时字符串不是空
{
if(str[i]>='0' && str[i]<='9')//如果出现了字符是0到9之间的数字
{
if(flag==-1)//如果前面出现的是+号
{
res=res*10-(str[i]-'0');
}
else
{
res=res*10+(str[i]-'0');
}
}
else//如果此时字符不是0到9之间的数字,返回数字 例如‘ -12ab34’ 这个返回结果应该是-12
{
return res;
}
//如果前面的字符都是数字,每次都需要检验数字的范围是否超出了
if(res>2147483647)
{
return 2147483647;
}
else if(res<-2147483648)
{
return -2147483648;
}
i++;
}
return res;
}
};
- Javascript:
/**
* @param {string} str
* @return {number}
*/
var myAtoi = function(str) {
if(str.length==0)//如果字符串长度是0 那么返回数字0
{
return 0;
}
var i=0;
var arr=str.split("");//将字符串放入数组中
var l=arr.length;//数组长度也就是字符串的长度
while(i<l && arr[i]==" ")//如果前面是空格,将空格都删掉
{
i++;
}
if(i==l)//如果空格去除后数组中没有元素了那么返回数字0 例如' ' 结果是0
{
return 0;
}
var res=0;//最后的储存结果
var flag=1;//正负号的标志
if(arr[i]=="+")
{
flag=1;
i++;
}
else if(arr[i]=="-")
{
flag=-1;
i++;
}
while(i<l)
{
if(arr[i].charCodeAt()>=48 && arr[i].charCodeAt()<=57)//如果数字是在0到9之间
{
res=res*10+flag*parseInt(arr[i]);
}
else
{
return res;
}
if(res>2147483647)
{
return 2147483647;
}
else if(res<-2147483648)
{
return -2147483648;
}
i++;
}
return res;
};