剑指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 ...
随机推荐
- JAVA内部类有关
最近在看单例模式的实现,看到有一种利用JAVA静态内部类的特性来实现,对于内部类我还真是不了解,遂了解了一下,代码贴上. /** * 内部类分为:成员内部类.局部内部类.匿名内部类和静态内部类. */ ...
- PhpStorm/Xdebug安装使用
安装环境:XAMPP;phpStorm版本10; windows 7 64bit. XAMPP.phpStorm 都直接安装在了D盘根目录,9999m目录建在D:\xampp\htocts下,即目录工 ...
- Python-匿名函数
lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方 常规版本: def fun(x,y) return x*y lambda版本: r = lambda x,y:x*y p ...
- How to configure security of ActiveMQ ?
Terms {activemq.home}: The ActiveMQ installation folder. How to configure ActiveMQ to use JAAS Authe ...
- 使用命令行+ideal 工具实现本地代码项目提交
在 OSChina 上建立一个私用的项目 mkdir test cd test git init touch README.md git add README.md git commit -m &qu ...
- 学习android 官方文档
9.29 1. 今天,FQ,看到android studio中文网上有一个FQ工具openVPN,我就使用了. 之前用过一个FQ工具开眼,但由于网速慢,我就弃用了. 2. 现在,我就可以FQ去andr ...
- css 浅析display属性
继续开始我的css之旅吧.今天我们来说什么啊.构思了两天还是没有什么思路,但是学习的步伐我们不能停止下来.还是按照之前的计划来讲讲display,在讲这个之前我们还是按照老规矩来扯扯蛋,步子不能够迈大 ...
- 使用maven搭建ssh框架
首先搭建sturts2框架,配置pom文件: <properties> <!-- 文件拷贝时的编码 --> <project.build.sourceEncoding&g ...
- rpm 看 rpm 包内容
1.命令 rpm #rpm -qpl packetname
- Sublime Text 3实用快捷键大全
下面是我通过网上教程和文本资料学习sublime Text3时收集的一些实用功能和常用快捷键,现在分享出来,如果还有其它的好用的功能可以在下面留言,以便互相学习和交流,谢谢!. 选择类 Ctrl+ ...