犹记得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相关推荐

  1. mysql小结果集驱动大结果集_具体优化查询语句的指导原则小结果集驱动大结果集避免子查询...

    原标题:具体优化查询语句的指导原则小结果集驱动大结果集避免子查询 具体优化Query语句的指导原则 (1)多使用Profile:(2)永远用小结果集驱动大的结果集:(3)尽可能在索引中完成排序:(4) ...

  2. HTML5期末大作业:榆林子州网站设计——榆林子州-含论文(6页) 榆林子州旅游网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW旅行网页作业

    HTML5期末大作业:榆林子州网站设计--榆林子州-含论文(6页) 榆林子州旅游网页HTML代码 学生网页设计与制作期末作业下载 大学生网页设计与制作成品下载 DW旅行网页作业 常见网页设计作业题材有 ...

  3. Qt编写大数据大屏UI电子看板系统

    前言 目前大屏大数据可视化UI这块非常火,趁热也用Qt来实现一个,Qt这个一站式超大型GUI超市,没有什么他做不了的,大屏电子看板当然也不在话下,有了QSS和QPainter这两个无敌的工具组合,借用 ...

  4. 可视化大数据大屏设计

    可视化大数据大屏设计 一.如何做好一款大屏 1.1工具的选择 帆软报表工具Finereport 1.2大屏设计 通用的大屏设计原则 1.大屏指标在8-12个为宜 2.比率类.数字类和子部分布类指标要合 ...

  5. 湖大深大A级学科数超南开,华科文科胜过武大!泰晤士的首份高校评级结果,让人有点方...

    白交 发自 凹非寺  量子位 报道 | 公众号 QbitAI 高考,出分了. 而英国知名第三方机构泰晤士,也赶趟提供了一份热腾腾的大学报考指南: 中国高校学科评级. 按照中国学科分类标准,来看看各个高 ...

  6. 原生态纯JavaScript 100大技巧大收集---你值得拥有

    原生态纯JavaScript 100大技巧大收集---你值得拥有 1.原生JavaScript实现字符串长度截取 function cutstr(str, len) {var temp;var ico ...

  7. 东北大学计算机学姐,东北的大学怎么样?聊聊哈工大、吉大、大工、东北大学、东北师大...

    成绩马上要出来了,家长和考生们都已经盘算上了.这个分能上什么大学,如果分不够高,就只能去东北上985大学了-- 东北这些年经济衰退了,连带着东北的高校也开始衰退,但是不是我们就不能选东北大学了呢?是不 ...

  8. python 3d大数据可视化软件_十大顶级大数据可视化工具推荐

    要使数据分析真正有价值和有洞察力,就需要高质量的可视化工具.市场上有很多产品,特点和价格各不相同,本文列出了一些广泛认可的工具.其实企业如何选择一个合适的可视化工具,并不是一件容易的事情,需要仔细的考 ...

  9. 眉骨高者为大贵之相_男人此处“高大”,大富大贵,前途不可限量!!

    原标题:男人此处"高大",大富大贵,前途不可限量!! 文/一得老师 DC在沉寂多年后,终于崛起了! 三天破6.5亿,两周破16亿:<海王>爆了! 海王饰演者杰森·莫玛, ...

最新文章

  1. 错误:返回局部变量数组名 \ 解决方案
  2. DirectX11 With Windows SDK--01 DirectX11初始化
  3. java标识符遵循规范
  4. 关闭edge任务栏预览_如何在Microsoft Edge中关闭选项卡预览
  5. 自行实现高性能MVC
  6. NIOS2随笔——BMP解码与VGA显示
  7. 【kafka】kafka 脚本 kafka-run-class.sh 使用介绍 jmx监控 查看jmx信息
  8. 雷达发现 |最新教育行业数据报告
  9. 谁用光了磁盘?Docker System命令详解
  10. Java异步多线程编程探索之CompletableFuture
  11. [C#] .NET4.0中使用4.5中的 async/await 功能实现异步
  12. 一图理解ceil和floor的区别
  13. 衬线字体和无衬线字体区别
  14. Java基础学习总结
  15. TODS:从时间序列数据中检测不同类型的异常值
  16. 不用 VIP 也能高速下载!迅雷 11 新版抢先体验 2T迅雷离线云盘
  17. 内网环境 CentOS7 搭建本地repo仓库源
  18. 教师运用计算机技术的难点,浅谈运用电脑技术进行备课的几点优势
  19. C# GDI 手绘图片转化为电子版处理
  20. vc6.0,vs2005下插入excel表格

热门文章

  1. 【成神之路】开放设计编程相关面试题
  2. 安装Adobe软件时显示:您的浏览器或者操作系统不再受支持,您可能需要安装操作系统的最新更新。
  3. [前端面试题][‘1‘,‘2‘,‘3‘].map(parseInt)
  4. 2022金九银十Android大厂面试题来袭,面试字节跳动被问Android屏幕适配方案
  5. c++小游戏(5项)
  6. python中ndarray对象_学习python的第二十二天(numpy模块(对矩阵的处理,ndarray对象)
  7. python绘图——绘制正负区分的柱形图[ax.bar()]
  8. PostgreSQL嵌套事务提交流程研究
  9. 号外:Axure导入有了!思维导图也正式上线了!
  10. 计计算机类学科代码是多少,高校专业代码表