转载请注明出处:http://blog.csdn.net/ns_code/article/details/28015693

题目描写叙述:

将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。

输入:

输入可能包括多个測试例子。
对于每一个測试案例,输入为一个合法或者非法的字符串,代表一个整数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】字符串转整数的更多相关文章

  1. 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除

    剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...

  2. 剑指offer之关于整数的处理

    首先是整数次方的处理 在这处理的时候有几个细节主义处理 1.当指数是负数的时候 2.当指数式0的时候 3.当不满足条件的时候要抛出异常 再一个就是常用的将一个树化为二进制的形式,或者是求整数的幂或者矩 ...

  3. 剑指offer字符串1

    面试题5:替换空格 请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. class Solu ...

  4. 剑指Offer 数值的整数次方

    题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.   思路: 要考虑边界,0,负数   AC代码: class Solution ...

  5. 剑指offer字符串列表

    字符串 面试题5:替换空格 面试题20:表示数值的字符串 面试题58:翻转字符串 面试题58(二):左旋转字符串

  6. leetcode46. Permutations 、47. Permutations II、 剑指offer字符串的排列

    字符串排列和PermutationsII差不多 Permutations第一种解法: 这种方法从0开始遍历,通过visited来存储是否被访问到,level代表每次已经存储了多少个数字 class S ...

  7. 《剑指offer》-统计整数二进制表示中1的个数

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 直观思路就是把二进制表示从右往左统计1的个数.直接想到移位操作来迭代处理.坑点在于负数的移位操作会填充1.有人贴出了逻辑移位 ...

  8. 剑指Offer——字符串的排列

    题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: ...

  9. 剑指Offer——数值的整数次方

    题目描述: 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 分析: 快速幂,简单解释下, 当e的二进制为1001011, b^e=b^( ...

  10. 剑指Offer——字符串的排序

    Question 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描 ...

随机推荐

  1. BZOJ 1880: [Sdoi2009]Elaxia的路线( 最短路 + dp )

    找出同时在他们最短路上的边(dijkstra + dfs), 组成新图, 新图DAG的最长路就是答案...因为两人走同一条路但是不同方向也可以, 所以要把一种一个的s,t换一下再更新一次答案 ---- ...

  2. hdu 4782 Beautiful Soupz

    模拟.其实这题就是题目比较长而已...读完题目就差不多了.tag直接读就可以了,题目说了不用修改.然后整个题目就是让求text部分,严格按空格分开.注意每行前面空格个数. #include<al ...

  3. 条码知识之九:EAN-128条码(上)

     EAN-128码,现称GS1-128码,是专用于GS1系统中的条码,可以标注商品的附加信息,在商品信息的标识.产品的跟踪与追溯中有广泛的用途. EAN-128码来自于CODE-128码,在字符集.条 ...

  4. kinect for windows - DepthBasics-D2D详解之一

    Depth在kinect中经常被翻译为深度图,指的是图像到摄像头的距离,这些距离数据能让机器知道物理距离有多远.kinect通过两个红外摄像头来实现这个功能的.在这个例子里,就实现了深度图的提取和现实 ...

  5. eclipse @ 注释为何一写就报错

    以前一直奇怪,为什么eclipse自动生成的的代码中的@注释不会报错,而我直接写@就会报错 原因其实很简单: eclipse会检查@注释的位置 举个例子:写@Override,直接写会报错,但如果你继 ...

  6. 基于Bresenham算法画圆

    bresenham算法画圆思想与上篇 bresenham算法画线段 思想是一致的 画圆x^2+y^2=R^2 将他分为8个部分,如上图 1. 只要画出1中1/8圆的圆周,剩下的就可以通过对称关系画出这 ...

  7. hpuoj回文串问题(manacher+kmp)

    1699: 回文串问题 时间限制: 1 Sec  内存限制: 128 MB 提交: 22  解决: 3 [提交][状态][讨论版] 题目描述 还是回文串问题,字符串是啥,大家应该都知道,就是满足 S[ ...

  8. Phonegap-----Media

    Everything in the code: <!DOCTYPE html> <html> <head> <title>Media Example&l ...

  9. (void)(&amp;x==&amp;y)

    #define max(x,y) ({ \ typeof(x) _x = (x);    \ typeof(y) _y = (y);    \ (void) (&_x == &_y); ...

  10. 【Web】CGI与Servlet技术对比

    CGI:Common Gateway Interface,通用网关接口. 1.CGI处理步骤 首先,客户端(即Web浏览器)根据某资源的URL向Web服务器提出请求:Web服务器的守护进程(HTTP ...