一道剑指offer经典面试题引发的思考
大家在拿到一道算法题的时候,都会思考些什么呢?
大家有没有想过,当有一位面试官追问你,这道题有没有什么问题,或者有没有什么更好的方法,你们的内心是怎样的呢?
可能你会瞪大了眼,一些盲目自信的同学可能会说:什么?还有问题??我这么可能遗漏什么呢?
一些怯场或者缺乏面试信心的同学此时可能已经手心冒汗了,开始反问自己:我是不是哪忽略了什么问题,哪些是我没有考虑到的呢
大家在拿到一些题目,并开始思考逻辑的过程中,难免会有一些思维漏洞,逻辑盲区,那我们如何去避免这样的问题发生呢,
今天就拿到《剑指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经典面试题引发的思考相关推荐
- 剑指Offer——迅雷笔试题+知识点总结
剑指Offer--迅雷笔试题+知识点总结 情景回顾 时间:2016.9.19 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:迅雷笔试 总体来说,迅雷笔试内容体量不算多,主要 ...
- 二叉树代码 java面试题_《剑指offer》面试题39 二叉树的深度(java)
摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...
- 《剑指offer》面试题的Python实现
所属网站分类: 面试经典 > python 作者:gg 链接: http://www.pythonheidong.com/blog/article/464/ 来源:python黑洞网 www.p ...
- 数组中其余的排除_[leetcode 剑指offer系列] 面试题04. 二维数组中的查找
题目难度: 简单 原题链接 今天继续更新剑指 offer 系列, 这道题的优化空间非常大, 个人感觉很适合作为面试题, 值得一做. 大家在我的公众号"每日精选算法题"中的聊天框中回 ...
- java牛客排序算法题_《剑指offer》面试题28:字符串的排列(牛客网版本) java...
输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述: 输入一个字符 ...
- 《剑指Offer》面试题四(牛客网在线编程第一题):二维数组中的查找(Java实现)
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...
- 【直通BAT】剑指Offer 经典试题整理(5)
45 把数组排成最小的数 题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个. 例如输入数组 [3, 32, 321],则打印出这3个数字能排成的最小 ...
- python正则表达式面试_【剑指offer】面试题19. 正则表达式匹配
面试题19. 正则表达式匹配 请实现一个函数用来匹配包含'. '和''的正则表达式.模式中的字符'.'表示任意一个字符,而''表示它前面的字符可以出现任意次(含0次).在本题中,匹配是指字符串的所有字 ...
- 剑指Offer——滴滴笔试题+知识点总结
文章目录 一.情景回顾 二.选择题 三.Linux链接 四.编程题 4.1 小青蛙走迷宫 4.2 末尾0的个数 五.简答题 六.Tomcat Server处理http请求的过程 一.情景回顾 时间:2 ...
最新文章
- 零基础入门学习Python(31)-异常处理2-try语句
- mysql 5.7.22初始密码_mysql5.7.22安装
- 两个矩阵是否相交的算法_收藏 | 计算机、数学、运筹学等领域的32个重要算法...
- 03_NoSQL数据库之Redis数据库:list类型
- 解决更新到os x10.11后openssl头文件无法找到的问题
- 每天一个linux命令---导出到文件
- java内存管理机制剖析(一)
- 单开双控_卧室或者楼梯灯怎么安装单联双控
- ES6入门——类的概念
- html文本框最小数字,HTML5中的数字类型的输入框:数字选择器
- wpf绑定 dictionary 给定关键字不再字典中_为什么要在 JavaScript 中学习函数式编程?...
- php爬虫框架phpfetcher,TrackRay:打造一款自己的渗透测试框架
- 如何快速提交网站备案 ICP备案
- Matlab绘制圆饼统计图pie的用法详解
- 冒泡排序图解并通过Java实现
- 安全架构--5--SDL安全与企业办公安全落地实践
- 利用Python开发王者荣耀,一路直奔上王者
- 你真以为贪吃蛇是个简单的游戏?
- FastReport不打印空白行
- win10 系统识别不了移动硬盘