剑指Offer面试题:35.将字符串转换为数字
时间:2022-06-07
本文章向大家介绍剑指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 = 0,
// 输入合法
Valid = 1
}
②定义方法主入口,在主入口中判断输入是否含有正负号并做对应处理
public static ConvertResult StrToInt(string str)
{
ConvertResult result = new ConvertResult();
result.State = ConvertState.InValid;
result.Number = 0;
if (!string.IsNullOrEmpty(str))
{
bool minus = false;
char[] strArray = str.ToCharArray();
int startIndex = 0;
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 = 0;
while (index < strArray.Length)
{
if (strArray[index] >= '0' && strArray[index] <= '9')
{
// 首先需要注意正负号
int flag = minus ? -1 : 1;
number = number * 10 + flag * (strArray[index] - '0');
// 正整数的最大值是0x7FFFFFFF,最小的负整数是0x80000000
// 因此需要考虑整数是否发生上溢出或者下溢出
if ((flag == 1 && number > int.MaxValue) ||
(flag == -1 && number < int.MinValue))
{
number = 0;
break;
}
index++;
}
else
{
number = 0;
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("123");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, 123);
}
// 功能测试:带正负号的数字字符串
[TestMethod]
public void StringToIntTest4()
{
ConvertResult actual = StringHelper.StrToInt("+123");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, 123);
}
// 功能测试:带正负号的数字字符串
[TestMethod]
public void StringToIntTest5()
{
ConvertResult actual = StringHelper.StrToInt("-123");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, -123);
}
// 功能测试:带正负号的字符串0
[TestMethod]
public void StringToIntTest6()
{
ConvertResult actual = StringHelper.StrToInt("+0");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, 0);
}
// 功能测试:带正负号的字符串0
[TestMethod]
public void StringToIntTest7()
{
ConvertResult actual = StringHelper.StrToInt("-0");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, 0);
}
// 特殊输入测试:非数字字符串
[TestMethod]
public void StringToIntTest8()
{
ConvertResult actual = StringHelper.StrToInt("1a33");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, 0);
}
// 特殊输入测试:有效的最大正整数 0x7FFFFFFF
[TestMethod]
public void StringToIntTest9()
{
ConvertResult actual = StringHelper.StrToInt("+2147483647");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, 2147483647);
}
[TestMethod]
public void StringToIntTest10()
{
ConvertResult actual = StringHelper.StrToInt("-2147483647");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, -2147483647);
}
[TestMethod]
public void StringToIntTest11()
{
ConvertResult actual = StringHelper.StrToInt("+2147483648");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, 0);
}
// 特殊输入测试:有效的最小负整数 0x80000000
[TestMethod]
public void StringToIntTest12()
{
ConvertResult actual = StringHelper.StrToInt("-2147483648");
Assert.AreEqual(actual.State, ConvertState.Valid);
Assert.AreEqual(actual.Number, -2147483648);
}
[TestMethod]
public void StringToIntTest13()
{
ConvertResult actual = StringHelper.StrToInt("+2147483649");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, 0);
}
[TestMethod]
public void StringToIntTest14()
{
ConvertResult actual = StringHelper.StrToInt("-2147483649");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, 0);
}
// 特殊输入测试:只有一个正号
[TestMethod]
public void StringToIntTest15()
{
ConvertResult actual = StringHelper.StrToInt("+");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, 0);
}
// 特殊输入测试:只有一个负号
[TestMethod]
public void StringToIntTest16()
{
ConvertResult actual = StringHelper.StrToInt("-");
Assert.AreEqual(actual.State, ConvertState.InValid);
Assert.AreEqual(actual.Number, 0);
}
3.2 测试结果
(1)测试用例通过情况
(2)代码覆盖率统计
作者:周旭龙
出处:http://edisonchou.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
- How to Install Nginx and PHP-FPM on FreeBSD 10
- 使用Apache MXNet分类交通标志图像
- CentOS 6.4 + nginx-1.2.5 + php-5.4.15 + MySQL-5.5.31
- 面试问题 - 只用位操作在ABAP里实现a+b
- JAVA 中异常处理的最佳实践
- webpack 4 升级指北
- 对抗蠕虫 —— 如何让按钮不被 JS 自动点击
- 让你的 git 拥有不同身份
- 购物网站的 redis 相关实现(Java)
- Chrome 常用插件 前端-后端-产品
- 更快更安全,HTTPS 优化总结
- Canvas 动画之支付宝价格拖动选择
- 使用 React 和 GraphQL 做一个todo list
- 徒手撸框架---实现 Aop
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 溯源黑帽利用 Web 编辑器漏洞非法植入 SEO 页面事件
- Milvus 查询合并机制
- Django model 层之Models与Mysql数据库小结
- 【010期】JavaSE面试题(十):集合之Map18连环炮!
- 每日打卡 373. 查找和最小的K对数字
- IE11出现"__doPostBack”未定义
- latex()、ploy2sym()、symsum()的妙用
- 性能最佳实践:MongoDB数据建模和内存大小调整
- 节省你生命的一个小技术No.193
- K8S 生态周报| Traefik v2.3.0-rc2 发布
- 如何从 Notion 批量导出 Markdown?
- 【LeetCode】1518. 换酒问题
- OBS推流工具使用说明
- Python多进程
- app反编译遇到360加固,傻瓜式脱壳