剑指Offer面试题:35.将字符串转换为数字
一、题目:将字符串转换为数字
题目:写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。
二、代码实现
(1)考虑输入的字符串是否是NULL、空字符串
(2)考虑输入的字符串是否包含正负号或者是否是只包含正负号
(3)考虑输入的字符串是否会发生上溢或下溢(正整数的最大值是0x7FFFFFFF,最小的负整数是0x80000000)
(4)考虑如何区分正常返回数字0和返回输入是否合法的标识
综上考虑,实现代码如下,这里使用C#语言描述:
①定义一个ConvertResult的结构体,作为返回值使用
public struct ConvertResult
{
public ConvertState State;
public int Number;
} public enum ConvertState
{
// 输入不合法
InValid = ,
// 输入合法
Valid =
}
②定义方法主入口,在主入口中判断输入是否含有正负号并做对应处理
public static ConvertResult StrToInt(string str)
{
ConvertResult result = new ConvertResult();
result.State = ConvertState.InValid;
result.Number = ; if (!string.IsNullOrEmpty(str))
{
bool minus = false;
char[] strArray = str.ToCharArray();
int startIndex = ;
if (strArray[startIndex] == '+')
{
startIndex++;
}
else if (strArray[startIndex] == '-')
{
minus = true;
startIndex++;
} if (startIndex != strArray.Length)
{
StrToIntCore(strArray, startIndex, minus, ref result);
}
} return result;
}
③定义核心方法StrToIntCore,将字符串转换为数字并为ConvertResult实例赋值,在此方法中判断是否发生上溢或下溢
private static void StrToIntCore(char[] strArray, int index, bool minus, ref ConvertResult result)
{
long number = ; while (index < strArray.Length)
{
if (strArray[index] >= '' && strArray[index] <= '')
{
// 首先需要注意正负号
int flag = minus ? - : ;
number = number * + flag * (strArray[index] - '');
// 正整数的最大值是0x7FFFFFFF,最小的负整数是0x80000000
// 因此需要考虑整数是否发生上溢出或者下溢出
if ((flag == && number > int.MaxValue) ||
(flag == - && number < int.MinValue))
{
number = ;
break;
}
index++;
}
else
{
number = ;
break;
}
} if (index == strArray.Length)
{
result.State = ConvertState.Valid;
result.Number = (int)number;
}
}
三、单元测试
3.1 测试用例
// 鲁棒性测试:NULL指针
[TestMethod]
public void StringToIntTest1()
{
ConvertResult actual = StringHelper.StrToInt(null);
Assert.AreEqual(actual.State, ConvertState.InValid);
} // 鲁棒性测试:空字符串
[TestMethod]
public void StringToIntTest2()
{
ConvertResult actual = StringHelper.StrToInt("");
Assert.AreEqual(actual.State, ConvertState.InValid);
} // 功能测试:普通的数字字符串
[TestMethod]
public void StringToIntTest3()
{
ConvertResult actual = StringHelper.StrToInt("");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, );
} // 功能测试:带正负号的数字字符串
[TestMethod]
public void StringToIntTest4()
{
ConvertResult actual = StringHelper.StrToInt("+123");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, );
} // 功能测试:带正负号的数字字符串
[TestMethod]
public void StringToIntTest5()
{
ConvertResult actual = StringHelper.StrToInt("-123");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, -);
} // 功能测试:带正负号的字符串0
[TestMethod]
public void StringToIntTest6()
{
ConvertResult actual = StringHelper.StrToInt("+0");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, );
} // 功能测试:带正负号的字符串0
[TestMethod]
public void StringToIntTest7()
{
ConvertResult actual = StringHelper.StrToInt("-0");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, );
} // 特殊输入测试:非数字字符串
[TestMethod]
public void StringToIntTest8()
{
ConvertResult actual = StringHelper.StrToInt("1a33");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, );
} // 特殊输入测试:有效的最大正整数 0x7FFFFFFF
[TestMethod]
public void StringToIntTest9()
{
ConvertResult actual = StringHelper.StrToInt("+2147483647");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, );
} [TestMethod]
public void StringToIntTest10()
{
ConvertResult actual = StringHelper.StrToInt("-2147483647");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, -);
} [TestMethod]
public void StringToIntTest11()
{
ConvertResult actual = StringHelper.StrToInt("+2147483648");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, );
} // 特殊输入测试:有效的最小负整数 0x80000000
[TestMethod]
public void StringToIntTest12()
{
ConvertResult actual = StringHelper.StrToInt("-2147483648");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, -);
} [TestMethod]
public void StringToIntTest13()
{
ConvertResult actual = StringHelper.StrToInt("+2147483649");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, );
} [TestMethod]
public void StringToIntTest14()
{
ConvertResult actual = StringHelper.StrToInt("-2147483649");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, );
} // 特殊输入测试:只有一个正号
[TestMethod]
public void StringToIntTest15()
{
ConvertResult actual = StringHelper.StrToInt("+");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, );
} // 特殊输入测试:只有一个负号
[TestMethod]
public void StringToIntTest16()
{
ConvertResult actual = StringHelper.StrToInt("-");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, );
}
3.2 测试结果
(1)测试用例通过情况

(2)代码覆盖率统计

剑指Offer面试题:35.将字符串转换为数字的更多相关文章
- 剑指offer 面试题35.复杂链表的复制
时间O(N),空间O(N) /* struct RandomListNode { int label; struct RandomListNode *next, *random; RandomList ...
- C++版 - 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)
面试题35:第一个只出现一次的字符 题目:在一个字符串中找到第一个只出现一次的字符.如输入abaccdeff,则输出b.(2006年google的一道笔试题.) 分析: 首先应向确认一下是ASCII字 ...
- 剑指Offer面试题:26.字符串的排列
一.题目:字符串的排列 题目:输入一个字符串,打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a.b.c所能排列出来的所有字符串abc.acb.bac.bca.cab和cba. 二 ...
- 【剑指Offer面试题】 九度OJ1510:替换空格
c/c++ 中的字符串以"\0"作为结尾符.这样每一个字符串都有一个额外字符的开销. 以下代码将造成内存越界. char str[10]; strcpy(str, "01 ...
- 剑指 Offer 20. 表示数值的字符串 + 有限状态自动机
剑指 Offer 20. 表示数值的字符串 Offer 20 常规解法: 题目解题思路:需要注意几种情况: 输入的字符串前后可能有任意多个空格,这是合法的. 正负号: (1)正负号只能出现一次. (2 ...
- 剑指Offer:面试题15——链表中倒数第k个结点(java实现)
问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...
- 剑指offer面试题3 二维数组中的查找(c)
剑指offer面试题三:
- 剑指Offer——笔试题+知识点总结
剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...
- C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告
剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...
- C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解
剑指offer 面试题23:从上往下打印二叉树 参与人数:4853 时间限制:1秒 空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...
随机推荐
- JS根据经纬度获取地址信息
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- 重置VS设置
用VS开发项目的时候, 偶发智能提示消失.关键字.类名不变色的情况. 如果你也遇到过,那么这样做: 新建txt,打开并输入以下内容: start "" "C:\Progr ...
- display:inline-block的间隙问题和解决办法
1.display:inline-block在水平方向的间隙: 代码如下: <style type="text/css"> *{margin:0; padding:0; ...
- Codeforces Round #388 (Div. 2) - B
题目链接:http://codeforces.com/contest/749/problem/B 题意:给定平行四边形的3个点,输出所有可能的第四个点. 思路:枚举任意两个点形成的直线,然后利用这两个 ...
- Python学习日志(三)
运算补充(因为之前看书看过的我又忘了...) python3 里 / 直接是浮点除.python2的 / 是直接整除,取整数部分,小数不要了,python3也可以这样整除,用//实现. **是乘方!! ...
- Spring 使用 SLF4J代替 Commons Logging 写日志 异常
项目的日志更换成slf4j和logback后,发现项目无法启动.错误提示 Caused by: java.lang.NoClassDefFoundError: Lorg/apache/commons/ ...
- Codeforces Round #345 (Div. 1) A. Watchmen
A. Watchmen time limit per test 3 seconds memory limit per test 256 megabytes input standard input o ...
- MVC Html.BeginForm 与 Ajax.BeginForm 使用总结
最近采用一边工作一边学习的方式使用MVC5+EF6做一个Demo项目, 期间遇到不少问题, 一直处于研究状态, 没能来得及记录. 今天项目进度告一段落, 得以有空记录学习中遇到的一些问题. 由于MVC ...
- Exchange管理界面
Exchange有三种管理方式,一个是通过Powershell命令行操作进行管理.Exchange自带的Powershell是在其基础上建的,加入了Exchange管理操作的函数,能够进行另外两种方式 ...
- window下xampp配置多端口、多站点步骤
好些日子没整理知识了,许多新东西不整理出来时间一长就淡忘了.看来以后得继续坚持整理. 配置XAMPP多端口.多站点如下步骤: 多端口: (一个域名下同时配置多个端口,从而达到访问不同程序) 效果例如: ...