大家在拿到一道算法题的时候,都会思考些什么呢?

大家有没有想过,当有一位面试官追问你,这道题有没有什么问题,或者有没有什么更好的方法,你们的内心是怎样的呢?

可能你会瞪大了眼,一些盲目自信的同学可能会说:什么?还有问题??我这么可能遗漏什么呢?

一些怯场或者缺乏面试信心的同学此时可能已经手心冒汗了,开始反问自己:我是不是哪忽略了什么问题,哪些是我没有考虑到的呢

大家在拿到一些题目,并开始思考逻辑的过程中,难免会有一些思维漏洞,逻辑盲区,那我们如何去避免这样的问题发生呢,

今天就拿到《剑指offer》的一道经典面试题来说起

  • 面试流程:

大家可以看一下,面试官都会有哪些提问,从他们的提问或者引导中能否感受到自己缺少的东西呢

面试官:能不能介绍一下C语言的库函数中atoi的作用?
应聘者: atoi用来把一个字符串转换成一个整数。比如输入字符串"123",它的输出是数字123。

面试官:对的。现在就请你写一个函数StrToInt,实现把字符串转换成整数这个功能。当然,不能使用atoi或者其他类似的库函数。你看有没有问题?
应聘者:(嘴角出现一丝自信的笑容)没有问题。应聘者马上开始在白纸上写出了如下代码:

int my_atoi(const char* str)
{int ret = 0;while (*str){ret = ret * 10 + (*str - '0');}return ret;
}

我出的题目有这么简单吗?你也太小看我了。

面试官:这么快?(稍微看了看代码)你觉得这代码有没有问题?仔细检查一下看看。
应聘者:(从头开始读代码)哦,不好意思,忘了检查字符串是空指针的情况。
应聘者拿起笔,在原来代码上添加两行新的代码。修改之后的代码如下:

int my_atoi(const char* str)
{int ret = 0;if (str == NULL)return 0;while (*str){ret = ret * 10 + (*str - '0');}return ret;
}

面试官:改好了?(看了一下新的代码)当字符串为空的时候,你的返回是0。如果输入的字符串是"O"的时候,返回是什么?
应聘者:也是0。

面试官:两种情况都得到返回值0,那么当这个函数的调用者得到返回值О的时候,他怎么知道是哪种情况?
应聘者:(脸上表情有些困惑)不知道。

面试官:你知道atoi是怎么区分的吗?
应聘者:(努力回忆,有些慌张)不记得了。

面试官: atoi是通过一个全局变量来区分的。如果是非法输入,返回0并把这个全局变量设为一个特殊标记。如果输入是"O",则返回0,不会设置全局变量。这样当atoi的调用者得到返回值0的时候,可以通过检查全局变量得知输入究竟是非法输入还是字符串"O"。等一下,除了空字符串之外,还有没有可能有其他类型的非法输入?
应聘者: (陷入思考,额头上出现汗珠)如果字符串中含有"0'到9'之外的字符,那么这样的输入也是非法的。

面试官:所有'0'到'9'之外的字符都是非法的吗?
应聘者:加号和减号应该也是合法的输入字符。
面试官:对的。先好好想想,想清楚了再开始写代码。

  • 面试分析

此时面试官的问题在不断地引导你书写正确的代码,并给你提供不同的测试环境和用例来使得你对应提出解决方案,总结如下

(1)如果传入的参数为空指针,怎么办?

(2)仅仅返回一个0就可以解决吗,如果我实际字符串就是一个数字0,比如char *str=“0”’,这个0和非法返回的0如何区分

(3)如果前面有空格如何考虑,比如“   123”??

(4)如果前面有正负号 如何考虑?

(5)返回值存储范围是否有限制,传入一个较长的字符串如何存储,是否存在精度丢失的问题?

  • 解决方案

1)需要状态标志位,来说明当前状态返回值是否有效,考虑到程序仅在某种特殊情况下返回值有效,其余大部分均非法无效,则设置默认状态为无效

(2)前有空格需要跳过,遇到正负号需要标志位来区分,遍历字符串结束的标志为,遇到‘\0’

(3)空指针和空字符串额情况下,需要返回无效状态下的0

(4)符合要求的进行逐个字符分解,转换为int整型,结束后判断结尾为‘\0’,无论后续还有其余任何字符,此时认为有效返回

(5)返回值的接收存放在long long类型中,存放一个较长的数字,以免精度丢失,但是为了保证精度不丢失,进行范围限制,以INT_MAX和INT_MIN来限制

  • 代码如下:

//my_atoi  实现数字字符转换为整数#include<stdio.h>
#include<limits.h>
#include<ctype.h>
//枚举设置返回类型是否有效的标志位
enum {VALID,INVALID
}state=VALID;int my_atoi(const char* str)
{int flag = 0;state = INVALID;if (str == NULL){return 0;}if (*str=='\0'){return 0;}while (isspace(*str)){str++;}if (*str == '+'){flag = 1;str++;}else if (*str == '-'){flag = -1;str++;}long long ret = 0;while (isdigit(*str)){ret = ret * 10 + flag * (*str - '0');if (ret > INT_MAX || ret < INT_MIN){ret = 0;return (int)ret;}str++;}if (*str == '\0'){state = VALID;return (int)ret;}return (int)ret;
}int main()
{char*p = "##";int ret = my_atoi(p);if (state == VALID){printf("%d\n", ret);}return 0;
}

最后:各位同学,注意到了吧,这不是说有编程能力就可以,还要有良好的编程习惯,好的编程习惯将会让你考虑问题更加全面,不会漏洞百出,

这种情况下就需要我们多思考,多刷题,正所谓见多识广,加油吧,打工人!!!

一道剑指offer经典面试题引发的思考相关推荐

  1. 剑指Offer——迅雷笔试题+知识点总结

    剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...

  2. 二叉树代码 java面试题_《剑指offer》面试题39 二叉树的深度(java)

    摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...

  3. 《剑指offer》面试题的Python实现

    所属网站分类: 面试经典 > python 作者:gg 链接: http://www.pythonheidong.com/blog/article/464/ 来源:python黑洞网 www.p ...

  4. 数组中其余的排除_[leetcode 剑指offer系列] 面试题04. 二维数组中的查找

    题目难度: 简单 原题链接 今天继续更新剑指 offer 系列, 这道题的优化空间非常大, 个人感觉很适合作为面试题, 值得一做. 大家在我的公众号"每日精选算法题"中的聊天框中回 ...

  5. java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...

    输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符 ...

  6. 《剑指Offer》面试题四(牛客网在线编程第一题):二维数组中的查找(Java实现)

    题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  7. 【直通BAT】剑指Offer 经典试题整理(5)

    45 把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 例如输入数组 [3, 32, 321],则打印出这3个数字能排成的最小 ...

  8. python正则表达式面试_【剑指offer】面试题19. 正则表达式匹配

    面试题19. 正则表达式匹配 请实现一个函数用来匹配包含'. '和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字 ...

  9. 剑指Offer——滴滴笔试题+知识点总结

    文章目录 一.情景回顾 二.选择题 三.Linux链接 四.编程题 4.1 小青蛙走迷宫 4.2 末尾0的个数 五.简答题 六.Tomcat Server处理http请求的过程 一.情景回顾 时间:2 ...

最新文章

  1. 零基础入门学习Python(31)-异常处理2-try语句
  2. mysql 5.7.22初始密码_mysql5.7.22安装
  3. 两个矩阵是否相交的算法_收藏 | 计算机、数学、运筹学等领域的32个重要算法...
  4. 03_NoSQL数据库之Redis数据库:list类型
  5. 解决更新到os x10.11后openssl头文件无法找到的问题
  6. 每天一个linux命令---导出到文件
  7. java内存管理机制剖析(一)
  8. 单开双控_卧室或者楼梯灯怎么安装单联双控
  9. ES6入门——类的概念
  10. html文本框最小数字,HTML5中的数字类型的输入框:数字选择器
  11. wpf绑定 dictionary 给定关键字不再字典中_为什么要在 JavaScript 中学习函数式编程?...
  12. php爬虫框架phpfetcher,TrackRay:打造一款自己的渗透测试框架
  13. 如何快速提交网站备案 ICP备案
  14. Matlab绘制圆饼统计图pie的用法详解
  15. 冒泡排序图解并通过Java实现
  16. 安全架构--5--SDL安全与企业办公安全落地实践
  17. 利用Python开发王者荣耀,一路直奔上王者
  18. 你真以为贪吃蛇是个简单的游戏?
  19. FastReport不打印空白行
  20. win10 系统识别不了移动硬盘

热门文章

  1. 菜鸟Python之————题海战术(13)
  2. linux服务端代理设置与linux下载工具
  3. mysql报错序号对应的错误
  4. 中科院陈玉福算法设计与分析 动态规划矩阵连乘计算问题
  5. 阿里全体系中台架构分享
  6. iptables 初识
  7. 云服务器怎样杀毒软件,云服务器用什么杀毒软件
  8. 二叉树的前、中、后序遍历的代码实现(递归方式)
  9. 2021年全球专业保险收入大约29740百万美元,预计2028年达到39950百万美元,2022至2028期间,年复合增长率CAGR为4.7%
  10. ubuntu 设置固定ip地址 或设置自动获取ip地址