July大神交大读书会子atoi
犹记得July大大在今年交大一次读书会上让大家10min写这个算法,然后讲解这个算法,我是通过百度网盘的视频看的,我10min没写出来,而且还是在输出exception case的几次提示下才AC掉的,而且关于需求分析还差了cplusplus的说明= =
今天写了这个函数,一开始想估计有千万种情况考虑,但是细细一想,其实也是可以枚举出来的,关键就是逻辑要能处理所有的case,
我已开始居然连需求都没弄清楚,他是允许非法字符的,只要前面有一些可以产生数值的,例如-9a.986返回-9,-9.a8a77a 返回-9,这感觉有点奇怪,我觉得出现非 + - . 0-9的就都是非法了,不知道系统设计出于什么目的。
设计逻辑了,前缀我主要分为4种:
1) [+|-] [(0-9)上加号] [非法或.]
2) [(0-9)上加号] [非法或.]
3) [+ | -] .
4) .
主要分为这些,然后先看第一个是否符号位,是的话i++, 然后这时判断i是否越界(每次i++ i--都要判断是否可能越了上下界,有的话就特殊处理,我又一次就这么错了),如果是的话,说明只有符号位,返回非法字符。否则从后面找连续的数字,然后同时loop 要判断是否越界,发现越界可以统一处理~ 然后后面算值,这部分比较简单,我又一次居然直接用ASCII码算= = 然后最后如果负数的话,根据之前的 符号判断,sum-=2*sum, 我出现正负数一起处理都是这样把两者统一成正数处理,这样逻辑比较清晰。
还有最最难想到的就是溢出了,从给的case来看如果上溢返回上届,下溢返回下届,所以需要再加完之后就判断,我之前还在最后判断发现已经没用了,sum已经因为溢出错了= = 然后如果上溢了,就返回上届,因为int是补码范围,负变正后负数最大会多一个,也即-2^31,但是发现这个case可以统一到里面,因为2^31溢出恰好变为-2^31,于是直接返回下届是对的。
我还有一次直接写2^31-1结果就不知道C++认为是什么了= =(后来发现了,是异或操作,2^31得到29然后-1得28,发现2^31=29=31-2,好像还有点规律可以挖掘)我有时候还会犯从数学到代码转换的一个缺口,甚至左右赋值都写错过一次,感觉程序设计和数学思维会有些不同
最后的最后,附上修改几次后的代码:
int myatoi(const char* str)
{string cppstr=str, intstr;istringstream istr(cppstr);int isnegative=false,i=0;while(istr>>intstr){if(intstr.at(0)=='-'){isnegative=true;i++;}if(intstr.at(0)=='+'){i++;}if(i==intstr.size())//whether only + -return 0;if(intstr.at(i)=='.')return 0;int starti=i;while(i<intstr.size()&&intstr.at(i)<='9'&&intstr.at(i)>='0')i++;int endi=i-1;int sum=0,weighti=0;for(int k=endi;k>=starti;k--,weighti++)sum+=(intstr.at(k)-'0')*pow(10.0, weighti);if(sum<0) //overflow{if(isnegative==false)return pow(2.0,31)-1;elsereturn -pow(2.0,31);}if(isnegative==true)sum-=2*sum;return sum;}if(intstr.size()==0)return 0;
}
代码质量太差了,这个是经典面试题,考察程序员的鲁棒性能力。
一下是代码,需要注意
1.正负号
2.上下溢出
3高位到低位逐个移动,计算sum和从低位的区别
4.用isdigit里面是字符,不是数值,例如'0' '9'
5. 判溢出要注意 >214748364 或者= 214748364 && *str>='8' 要这样,之前犯了一次错误
下面的是代码
int atoi(const char* str){bool flag=1;while((*str)==' ') str++;if((*str)=='+') str++,flag=1;else if((*str)=='-') str++,flag=0;int sum=0;while(isdigit(*str)){if(flag){if(sum >214748364 || sum==214748364 && (*str)>='8' ) {return (int)((1<<31)-(unsigned int)1);}}else{if(sum>214748364 || sum==214748364 && (*str)>='9') {return (int)(1<<31);}}sum*=10;sum+=((*str)-'0');str++;} return flag? sum : -sum;}
这个代码应该是比较简洁版的。实现较为方便。
July大神交大读书会子atoi相关推荐
- mysql小结果集驱动大结果集_具体优化查询语句的指导原则小结果集驱动大结果集避免子查询...
原标题:具体优化查询语句的指导原则小结果集驱动大结果集避免子查询 具体优化Query语句的指导原则 (1)多使用Profile:(2)永远用小结果集驱动大的结果集:(3)尽可能在索引中完成排序:(4) ...
- HTML5期末大作业:榆林子州网站设计——榆林子州-含论文(6页) 榆林子州旅游网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW旅行网页作业
HTML5期末大作业:榆林子州网站设计--榆林子州-含论文(6页) 榆林子州旅游网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW旅行网页作业 常见网页设计作业题材有 ...
- Qt编写大数据大屏UI电子看板系统
前言 目前大屏大数据可视化UI这块非常火,趁热也用Qt来实现一个,Qt这个一站式超大型GUI超市,没有什么他做不了的,大屏电子看板当然也不在话下,有了QSS和QPainter这两个无敌的工具组合,借用 ...
- 可视化大数据大屏设计
可视化大数据大屏设计 一.如何做好一款大屏 1.1工具的选择 帆软报表工具Finereport 1.2大屏设计 通用的大屏设计原则 1.大屏指标在8-12个为宜 2.比率类.数字类和子部分布类指标要合 ...
- 湖大深大A级学科数超南开,华科文科胜过武大!泰晤士的首份高校评级结果,让人有点方...
白交 发自 凹非寺 量子位 报道 | 公众号 QbitAI 高考,出分了. 而英国知名第三方机构泰晤士,也赶趟提供了一份热腾腾的大学报考指南: 中国高校学科评级. 按照中国学科分类标准,来看看各个高 ...
- 原生态纯JavaScript 100大技巧大收集---你值得拥有
原生态纯JavaScript 100大技巧大收集---你值得拥有 1.原生JavaScript实现字符串长度截取 function cutstr(str, len) {var temp;var ico ...
- 东北大学计算机学姐,东北的大学怎么样?聊聊哈工大、吉大、大工、东北大学、东北师大...
成绩马上要出来了,家长和考生们都已经盘算上了.这个分能上什么大学,如果分不够高,就只能去东北上985大学了-- 东北这些年经济衰退了,连带着东北的高校也开始衰退,但是不是我们就不能选东北大学了呢?是不 ...
- python 3d大数据可视化软件_十大顶级大数据可视化工具推荐
要使数据分析真正有价值和有洞察力,就需要高质量的可视化工具.市场上有很多产品,特点和价格各不相同,本文列出了一些广泛认可的工具.其实企业如何选择一个合适的可视化工具,并不是一件容易的事情,需要仔细的考 ...
- 眉骨高者为大贵之相_男人此处“高大”,大富大贵,前途不可限量!!
原标题:男人此处"高大",大富大贵,前途不可限量!! 文/一得老师 DC在沉寂多年后,终于崛起了! 三天破6.5亿,两周破16亿:<海王>爆了! 海王饰演者杰森·莫玛, ...
最新文章
- 错误:返回局部变量数组名 \ 解决方案
- DirectX11 With Windows SDK--01 DirectX11初始化
- java标识符遵循规范
- 关闭edge任务栏预览_如何在Microsoft Edge中关闭选项卡预览
- 自行实现高性能MVC
- NIOS2随笔——BMP解码与VGA显示
- 【kafka】kafka 脚本 kafka-run-class.sh 使用介绍 jmx监控 查看jmx信息
- 雷达发现 |最新教育行业数据报告
- 谁用光了磁盘?Docker System命令详解
- Java异步多线程编程探索之CompletableFuture
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
- 一图理解ceil和floor的区别
- 衬线字体和无衬线字体区别
- Java基础学习总结
- TODS:从时间序列数据中检测不同类型的异常值
- 不用 VIP 也能高速下载!迅雷 11 新版抢先体验 2T迅雷离线云盘
- 内网环境 CentOS7 搭建本地repo仓库源
- 教师运用计算机技术的难点,浅谈运用电脑技术进行备课的几点优势
- C# GDI 手绘图片转化为电子版处理
- vc6.0,vs2005下插入excel表格
热门文章
- 【成神之路】开放设计编程相关面试题
- 安装Adobe软件时显示:您的浏览器或者操作系统不再受支持,您可能需要安装操作系统的最新更新。
- [前端面试题][‘1‘,‘2‘,‘3‘].map(parseInt)
- 2022金九银十Android大厂面试题来袭,面试字节跳动被问Android屏幕适配方案
- c++小游戏(5项)
- python中ndarray对象_学习python的第二十二天(numpy模块(对矩阵的处理,ndarray对象)
- python绘图——绘制正负区分的柱形图[ax.bar()]
- PostgreSQL嵌套事务提交流程研究
- 号外:Axure导入有了!思维导图也正式上线了!
- 计计算机类学科代码是多少,高校专业代码表