1、题目描述
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0。
2、代码
2.1 原理:
这个题目从题目本身上来说是不难的,但是主要是需要注意一些特殊的情况需要加以判断,以下是一个需要考虑的特殊情况:
(1)如果输入的字符串是空的字符
(2)如果输入是带正负号的字符串
(3)在(2)的基础上,如果只有一个字符,且这个字符就是+-号
(4)如果字符串的数值超过了整数的最大范围,如何处理,这里最好一开始就用long long int的数值类型。
一般是刷题的时候,网上提交的时候,如果函数的形式实现设定好了,就只需要考虑前面三点了,但是如果是自己写代码,就需要注意后面的几点了。
2.2 代码:
//将字符串转化成整数
class Solution1 {
public:
bool bSucceed;
int StrToInt(string str) {
bSucceed = true;
if(str.empty())
{
bSucceed = false;
return 0;
}
//只输入一个正号或者是负号
if(str.size()==1 && (str[0]=='+' || str[0]=='-'))
{
bSucceed = false;
return 0;
}
auto size = str.size();
auto c = str[0];
int num=0;
bool temp=false; //判断是否为负数
for(auto i=0;i<size;i++)
{
if(i==0)
{
if(c=='+' || c =='-' || (c>='0'&&c<='9'))
{
if(c=='-')
temp=true;
else if(c>='0'&&c<='9')
num=num*10+(c-'0');
}
else
{
bSucceed = false;
return 0;
}
}
else
{
if(str[i]>='0'&&str[i]<='9')
num=num*10+str[i]-'0';
else
{
bSucceed = false;
return 0;
}
}
}
if(temp)
num*=-1;
return num;
}
};
3 扩展:将字符串转化成小数
转化成小数,需要考虑到小数点,以及小数点后的数据的位数。
//将字符串转化成小数
class Solution {
public:
double StrToInt(string str) {
if(str.empty())
return 0;
auto size = str.size();
auto c = str[0];
double num=0;
bool temp=false; //判断是否为负数
bool bBool = false; //小数是否标志位
int times=0; //记录小数点后数据的位数
for(auto i=0;i<size;i++)
{
if(i==0)
{
if(c=='+' || c =='-' || (c>='0'&&c<='9'))
{
if(c=='-')
temp=true;
else if(c>='0'&&c<='9')
num=num*10+(c-'0');
}
else
return 0;
}
else
{
if(str[i]>='0'&&str[i]<='9')
{
if(!bBool) //小数点之前
num=num*10+str[i]-'0';
else //小数点后
{
times--;
num=num+(str[i]-'0')*pow(10, times);
}
}
else if(str[i]=='.')
{
if(bBool==false)
bBool=true;
else //如果之前出现过小数点
return 0;
}
else
return 0;
}
}
if(temp)
num*=-1;
return num;
}
};
写在最后:
做这一类的题目,最需要注意的点:首先考虑特殊情况,将所有的特殊情况尽量考虑的清楚点,思路一定要清晰了再开始写代码。