【剑指offer】字符串转整数
2014-06-02 08:52
239 查看
转载请注明出处:http://blog.csdn.net/ns_code/article/details/28015693
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。输入:输入可能包含多个测试样例。
对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000)。输出:对应每个测试案例,
若输入为一个合法的字符串(即代表一个整数),则输出这个整数。
若输入为一个非法的字符串,则输出“My God”。样例输入:
最近做这几道题目,对九度后台的测试用例有点无语了,这道题目的测试用例应该有问题,我写的代码自己测试了很多种不同的非法输入以及合法输入,都没问题,但是在九度OJ上只有第四条测试用例通过,其他四条全部WA,害的我搞了一个晚上,后来下了个别人AC的代码,拿来测试了下,结果各种非法的输入都没处理,很多非法的输入,得到的都是些五花八门的答案。
先贴上代码,大家帮我看下有木有没考虑到的地方:
#include<stdio.h>
#include<stdbool.h>
bool IsValid;
long StrToIInt(const char *str)
{
//非法输入
if(str == NULL)
{
IsValid = false;
return 0;
}
//是否为负数
bool IsMinus = false;
//跳过前面的空白字符
while(*str == ' ')
str++;
//第一个非空白字符为+号
if(*str == '+')
str++;
//第一个非空白字符为-号
else if(*str == '-')
{
str++;
IsMinus = true;
}
//如果只输入了空白字符、符号位,或者什么都没输入,也为非法输入
if(*str == '\0')
{
IsValid = false;
return 0;
}
//后面的输入如果合法,则转化为整数
long num = 0; //转化为整数后的结果
//这样可以使类似234asd的输入也判定为合法输入,得到的结果为234
while(*str != '\0')
{
//输入不在0-9之间,属于非法输入
if(*str<'0' || *str>'9')
{
IsValid = false;
return 0;
}
//对不包含符号位的合法输入进行转换
num = 10*num + (*str - '0');
str++;
}
//根据符号位转换正负
num = IsMinus ? (-1*num) : num;
//判断是否溢出了int的范围
if(num>0X7FFFFFFF || num<(signed int)0X80000000)
{
IsValid = false;
return 0;
}
//上面没有返回,则说明合法并没有发生溢出
return num;
}
int main()
{
static char str[100000000];
while(gets(str) != NULL)
{
IsValid = true;
long result = StrToIInt(str);
if(IsValid)
printf("%ld\n",result);
else
printf("My God\n");
}
return 0;
}
最后查到有些人讲类似123abc这样的输入也作为合法输入,这样得到的结果是123,去掉了后面的非法字符,我就索性又把程序改了下,把这种情况纳入合法输入的范围内,改成如下代码:#include<stdio.h>
#include<stdbool.h>
bool IsValid;
long StrToIInt(const char *str)
{
//非法输入
if(str == NULL)
{
IsValid = false;
return 0;
}
//是否为负数
bool IsMinus = false;
//跳过前面的空白字符
while(*str == ' ')
str++;
//第一个非空白字符为+号
if(*str == '+')
str++;
//第一个非空白字符为-号
else if(*str == '-')
{
str++;
IsMinus = true;
}
//如果只输入了空白字符、符号位,或者什么都没输入,也为非法输入
// if(*str == '\0')
// {
// IsValid = false;
// return 0;
// }
//如果第一个非负号位输入的不是0-9的数字,为非法输入
if(*str<'0' || *str>'9')
{
IsValid = false;
return 0;
}
//后面的输入如果合法,则转化为整数
long num = 0; //转化为整数后的结果
//这样可以使类似234asd的输入也判定为合法输入,得到的结果为234
while(*str != '\0' && *str>='0' && *str<='9')
{
//输入不在0-9之间,属于非法输入
// if(*str<'0' || *str>'9')
// {
// IsValid = false;
// return 0;
// }
//对不包含符号位的合法输入进行转换
num = 10*num + (*str - '0');
str++;
}
//根据符号位转换正负
num = IsMinus ? (-1*num) : num;
//判断是否溢出了int的范围
if(num>0X7FFFFFFF || num<(signed int)0X80000000)
{
IsValid = false;
return 0;
}
//上面没有返回,则说明合法并没有发生溢出
return num;
}
int main()
{
static char str[100000000];
while(gets(str) != NULL)
{
IsValid = true;
long result = StrToIInt(str);
if(IsValid)
printf("%ld\n",result);
else
printf("My God\n");
}
return 0;
} 这次居然前三个测试用例通过了,后面两个WA了,搞得我晕头转向,下载了个别人的AC代码,一眼看过去就感觉很多非法输入没有考虑到,测试了下,确实很多非法的输入,得到的结果五花八门。贴出来大家瞅瞅,分析下看是不是这道题的后台测试用例有问题。 别人AC的代码:#include<stdio.h>
#include<stdlib.h>
int state=0;
long StrToInt(const char * str)
{
long num;
num = 0;
if(str!=NULL)
{
const char * digit = str;
int minus = 0; //判断正负(第一个字符)
if(*digit=='+')
{
digit++;
}
else if(*digit=='-')
{
minus = 1;
digit++;
}
while(*digit!='\0') //'\0'与'0'区别
{
if(*digit>='0' && *digit<='9')
num = 10*num+(*digit-'0');
else
{
state=1;
num=0;
break;
} //输入不合法
digit++;
state=0;
}
if(minus)
{
num = 0 - num;
}
}
return num;
}
int main()
{
long res;
char st[100];
char *p = st;
while(scanf("%s", p)!=EOF)
{
res = StrToInt(p);
if(state==0)
printf("%ld\n", res);
else if(state==1)
printf("My God\n");
}
return 0;
}
/**************************************************************
Problem: 1508
User: muddytu
Language: C
Result: Accepted
Time:0 ms
Memory:912 kb
****************************************************************/ 无力吐槽了,稀里糊涂的搞了整整一个晚上,竟然是这样的结果。我还是觉得第一次的代码是最正确的,不应该将类似123abc这样的输入纳入合法的输入范围中。
题目描述:将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。输入:输入可能包含多个测试样例。
对于每个测试案例,输入为一个合法或者非法的字符串,代表一个整数n(1<= n<=10000000)。输出:对应每个测试案例,
若输入为一个合法的字符串(即代表一个整数),则输出这个整数。
若输入为一个非法的字符串,则输出“My God”。样例输入:
5 -5 +8样例输出:
5 -5 8关于这道题目,题目本身还是不错的,真正核心的代码也就那么两行,大部分代码基本都在做非法输入的检查。
最近做这几道题目,对九度后台的测试用例有点无语了,这道题目的测试用例应该有问题,我写的代码自己测试了很多种不同的非法输入以及合法输入,都没问题,但是在九度OJ上只有第四条测试用例通过,其他四条全部WA,害的我搞了一个晚上,后来下了个别人AC的代码,拿来测试了下,结果各种非法的输入都没处理,很多非法的输入,得到的都是些五花八门的答案。
先贴上代码,大家帮我看下有木有没考虑到的地方:
#include<stdio.h>
#include<stdbool.h>
bool IsValid;
long StrToIInt(const char *str)
{
//非法输入
if(str == NULL)
{
IsValid = false;
return 0;
}
//是否为负数
bool IsMinus = false;
//跳过前面的空白字符
while(*str == ' ')
str++;
//第一个非空白字符为+号
if(*str == '+')
str++;
//第一个非空白字符为-号
else if(*str == '-')
{
str++;
IsMinus = true;
}
//如果只输入了空白字符、符号位,或者什么都没输入,也为非法输入
if(*str == '\0')
{
IsValid = false;
return 0;
}
//后面的输入如果合法,则转化为整数
long num = 0; //转化为整数后的结果
//这样可以使类似234asd的输入也判定为合法输入,得到的结果为234
while(*str != '\0')
{
//输入不在0-9之间,属于非法输入
if(*str<'0' || *str>'9')
{
IsValid = false;
return 0;
}
//对不包含符号位的合法输入进行转换
num = 10*num + (*str - '0');
str++;
}
//根据符号位转换正负
num = IsMinus ? (-1*num) : num;
//判断是否溢出了int的范围
if(num>0X7FFFFFFF || num<(signed int)0X80000000)
{
IsValid = false;
return 0;
}
//上面没有返回,则说明合法并没有发生溢出
return num;
}
int main()
{
static char str[100000000];
while(gets(str) != NULL)
{
IsValid = true;
long result = StrToIInt(str);
if(IsValid)
printf("%ld\n",result);
else
printf("My God\n");
}
return 0;
}
最后查到有些人讲类似123abc这样的输入也作为合法输入,这样得到的结果是123,去掉了后面的非法字符,我就索性又把程序改了下,把这种情况纳入合法输入的范围内,改成如下代码:#include<stdio.h>
#include<stdbool.h>
bool IsValid;
long StrToIInt(const char *str)
{
//非法输入
if(str == NULL)
{
IsValid = false;
return 0;
}
//是否为负数
bool IsMinus = false;
//跳过前面的空白字符
while(*str == ' ')
str++;
//第一个非空白字符为+号
if(*str == '+')
str++;
//第一个非空白字符为-号
else if(*str == '-')
{
str++;
IsMinus = true;
}
//如果只输入了空白字符、符号位,或者什么都没输入,也为非法输入
// if(*str == '\0')
// {
// IsValid = false;
// return 0;
// }
//如果第一个非负号位输入的不是0-9的数字,为非法输入
if(*str<'0' || *str>'9')
{
IsValid = false;
return 0;
}
//后面的输入如果合法,则转化为整数
long num = 0; //转化为整数后的结果
//这样可以使类似234asd的输入也判定为合法输入,得到的结果为234
while(*str != '\0' && *str>='0' && *str<='9')
{
//输入不在0-9之间,属于非法输入
// if(*str<'0' || *str>'9')
// {
// IsValid = false;
// return 0;
// }
//对不包含符号位的合法输入进行转换
num = 10*num + (*str - '0');
str++;
}
//根据符号位转换正负
num = IsMinus ? (-1*num) : num;
//判断是否溢出了int的范围
if(num>0X7FFFFFFF || num<(signed int)0X80000000)
{
IsValid = false;
return 0;
}
//上面没有返回,则说明合法并没有发生溢出
return num;
}
int main()
{
static char str[100000000];
while(gets(str) != NULL)
{
IsValid = true;
long result = StrToIInt(str);
if(IsValid)
printf("%ld\n",result);
else
printf("My God\n");
}
return 0;
} 这次居然前三个测试用例通过了,后面两个WA了,搞得我晕头转向,下载了个别人的AC代码,一眼看过去就感觉很多非法输入没有考虑到,测试了下,确实很多非法的输入,得到的结果五花八门。贴出来大家瞅瞅,分析下看是不是这道题的后台测试用例有问题。 别人AC的代码:#include<stdio.h>
#include<stdlib.h>
int state=0;
long StrToInt(const char * str)
{
long num;
num = 0;
if(str!=NULL)
{
const char * digit = str;
int minus = 0; //判断正负(第一个字符)
if(*digit=='+')
{
digit++;
}
else if(*digit=='-')
{
minus = 1;
digit++;
}
while(*digit!='\0') //'\0'与'0'区别
{
if(*digit>='0' && *digit<='9')
num = 10*num+(*digit-'0');
else
{
state=1;
num=0;
break;
} //输入不合法
digit++;
state=0;
}
if(minus)
{
num = 0 - num;
}
}
return num;
}
int main()
{
long res;
char st[100];
char *p = st;
while(scanf("%s", p)!=EOF)
{
res = StrToInt(p);
if(state==0)
printf("%ld\n", res);
else if(state==1)
printf("My God\n");
}
return 0;
}
/**************************************************************
Problem: 1508
User: muddytu
Language: C
Result: Accepted
Time:0 ms
Memory:912 kb
****************************************************************/ 无力吐槽了,稀里糊涂的搞了整整一个晚上,竟然是这样的结果。我还是觉得第一次的代码是最正确的,不应该将类似123abc这样的输入纳入合法的输入范围中。
相关文章推荐
- 剑指offer 50 把字符串转换成整数
- 剑指offer--把字符串转换成整数
- 【剑指offer-解题系列(50)】把字符串转换成整数
- 剑指offer-----将一个字符串转换成对应的整数(模拟atoi)
- 剑指Offer-67:把字符串转换成整数
- 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ
- 剑指offer题解 把字符串转换成整数(todo:考虑大整数的情况)
- 【剑指offer】字符串转整数
- 剑指Offer - 九度1508 - 把字符串转换成整数
- 剑指offer——把字符串转换成整数
- 【剑指Offer面试编程题】题目1508:把字符串转换成整数--九度OJ
- 剑指offer_把字符串转换成整数
- 剑指offer - 面试题49:把字符串转换为整数
- 剑指offer 49. 把字符串转换成整数
- (C++)剑指offer-49:把字符串转换成整数(综合)
- 【剑指offer】题49:字符串转整数
- 剑指offer(46)-把字符串转换成整数
- 剑指offer--字符串转换为整数
- 剑指offer之字符串到整数的转换,例如输入字符串12345,输出整数12345.
- 剑指offer-49.把字符串转换成整数