面试官一个简单的问题,让我emo了两年半

简介: 面试官一个简单的问题,让我emo了两年半

“小伙子,你擅长什么语言呢?😊😊😊”


眼前的面试官和善的问我。


“哼哼,当然是C语言,我可是C语言大佬!😋😋😋”


我骄傲不已,想着自己一定能惊艳到面试官。


面试官递给我一道题目,看到这道题目,我漏出自信迷人的微笑。


模拟实现atoi函数,我心想这也太简单了吧!


atoi函数功能是将数字字符串转换为整数;

比如数字字符串"12345"被atoi转换为12345,数字字符串"-12345"被转换为-12345。


于是拿起键盘框框一顿敲,写出了以下代码。


int my_atoi(const char* str)
{
  int n = 0;
  while (*str != '\0')
  {
  n = n * 10 + (*str - '0');
  str++;
  }
  return n;
}
int main()
{
  char arr[100] = "12345";
  int ret = my_atoi(arr);
  printf("%d\n", ret);
  return 0;
}


我将布满我娟秀笔迹的答卷递给面试官。


面试官直接😅😅😅地看着我。


“小伙子,你是不是想的太简单了??😅😅😅”


他给我说了几种情况,我的内心是崩溃的!😎->😭


3fe8039904d3bba96107dd16894af387_9fb5bfff221748b3b6224cfc132bfd06.jpeg


我写的太浅显了!!!所谓的半瓶子水晃荡就是说我这样的情况。


以下几种可能出现的特殊情况中的任意一种,我都没有考虑😭😭😭


1.空指针


2.空字符串


3.非数字字符


4.溢出问题(所得数字大于INT_MAX或者小于INT_MIN)


5.正负号问题


于是我痛定思痛,狠狠地改进了我的代码。


1.首先,空指针的问题就用assert断言函数来解决。


2. 当字符串为空时,我们会return 0,可是万一我们输入的字符串就是 '0',那要怎么区分这两种情况呢?


我们可以用枚举类型定义 VALID,INVALID,也就是合法或者不合法。


默认其为INVALID,当为空字符串时就是非法,除非字符串正常到'\0',我们再将INVALID改为VALID,这样就能区分开。


3.非数字字符的问题就用isdight函数,当判断为数字字符时再进行运算。


4.溢出问题怎么解决呢?我们包含 limits.h 头文件,这样我们就可以使用INT_MAX和INT_MIN两个值,当溢出时直接return 0,当然,为了使定义的变量能存放大于int类型极限的数值,它的类型应该定义为long long int。


5.喜闻乐见的正负号问题就不用多说了,定义一个flag变量并让它等于1,当发现 ‘-’ 时,就将它变成-1,在运算时,就让结果乘等flag。


6.为了保险,返回时我们将long long int类型的值强制类型转换为int类型。


经过以上改头换面的几个操作,我们最终版的atoi函数出炉!掌声欢迎它的到来。


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<ctype.h>
#include<limits.h>
#include <assert.h>
enum state
{
  VALID,
  INVALID
};
enum state s = INVALID;
int my_atoi(const char *str)
{
  assert(str);
  long long int ret;
  int a = 0, flag = 1;
    if (*str == '-')
  {
    flag = -1;
    str++;
  }
  else if (*str == '+')
  {
    str++;
  }
  while (*str)
  {
  if (isdigit(*str))
  {
    a = 10 * a + flag * (*str- '0');
    if (a > INT_MAX || a < INT_MIN)
    {
    return 0;
    }
  }
  else
  {
    return (int)a;
  }
  str++;
  }
  if (*str == '\0')
  {
  s = VALID;
  return (int)a;
  }
}
int main()
{
  char a[100] = {""};
  scanf("%s", a);
  int ret = my_atoi(a);
  if (s == INVALID)
  {
  printf("非法输入:>");
  printf("%d", ret);
  }
  else
  {
  printf("%d", ret);
  }
  return 0;
}


回到家里的我不停想着面试官😅😅😅表情,心里emo不已,下次不会再出现这样的错误了!


相关文章
|
6月前
|
缓存 算法 NoSQL
凭借一份“面试真经pdf”,我四面字节跳动,拿下1-2级offer
近两年是中国互联网企业组织架构升级的大年,阿里、腾讯、小米、快手等知名互联网企业都进行了相应调整。2020年3月12日,字节跳动成立八周年之际,宣布组织全面升级,而这一消息也彻底激起了我对字节跳动的期待。
|
6月前
|
设计模式 算法 NoSQL
Java开发三年四面字节跳动复习一个月斩获offer,寒冬并不可怕
目前互联网行业形势越来越严峻,我接连投递了很多的简历,得到的回复却是寥寥无几,索性好好复习了大概一个半月的样子,挑战字节跳动成功!!接下来分享我在字节面试遇到的面试题,欢迎大家文末留言与我一起讨论!
|
消息中间件 缓存 NoSQL
闭关三月:整理出了这份对标阿里p7的java秋招面试必备指南。
大厂的面试从来不会是固定的,特别是像阿里这种一线互联网公司,想要进这种大厂,每个重点的知识点都是要了解的,给大家带来的春招面试必备指南会从面试官的心理分析,大厂经常问到的问题,以及对面试的问题分析,分享给大家,涉及到的知识点包含了有消息队列,Redis缓存,分库分表,读写分离,分布式系统,高可用架构,spring微服务,等架构专题
牛皮!仅凭“阿里爸爸”大厂面试参考笔记,去携程Java三面,已OC
今天来分享一位读者携程校招 Java 岗位的面经。 下面是正文。 个人背景:双非本,机械专业转码。 携程在正式面试之前,会有一个性格测试(40分钟)。性格测试之后,大概过一周进行笔试。笔试之后,会邮件通知是否通过并预约第一轮面试时间。 普通 offer 一般只有两面,如果是 sp 或者 ssp 的话,技术面貌似是三面。 携程的面试难度一般,效率比较高,面试体验还是不错的。
|
Dubbo Java 关系型数据库
解决90%BAT大厂!京东在职大佬实测总汇“java面试真题”颠覆认知
金九银十的高峰已经到来,但现在没找到满意工作的小伙伴还是有很多。包括我的朋友因为工作上的一些小问题毅然决然的裸辞来,结果现在的就业环境弄的到现在都没找到一份合适的。面试也是一波又一波的把他打倒了。
|
消息中间件 Dubbo Java
大厂必刷!国内顶级“Java面试总汇2023”跳槽底气 统计通过率95%
前言 今天已经是金九银十的第15天了。不知现在有多少小伙伴找到自己满意的工作了。今年的面试比以往几年的都要多些难度。随着学习it的人越来越多竞争也是越来越多,越来越卷
73 0
|
消息中间件 算法 Java
面试造飞机? 网易在职顶级大佬“java面试真题 2023” (助上岸)
现在的互联网环境可以说是比较难受的了,学习it的越来越多行业越来越卷,导致更加多的程序员去争取更少的岗位。其实很多人的技术还是不错的但一面试可能还是会被刷下去。
95 0
|
算法 网络协议 Java
备战秋招狂刷这份大厂级24W字java面试手册2个月可成功逆袭上岸!
23年金三银四程序员跳槽或者找工作并不理想,迟迟找不到工作,甚至大厂还进行几轮裁员,导致整个就业市场都不是太好! 出现这种情况是因为中美贸易战,导致大环境不好、大厂裁员、就业情况差、企业要求变高、各行各业越来越卷,尤其是程序员,处于这个阶段,感觉特别明显! 对于程序员这个群体来说,java程序员的占比就非常之高,就业市场等于说是千军万马过独木桥,简直可以说是太难了!卷不过、根本卷不过! 在这里想说的是,大环境已经这样了,我们已经也无法左右这个市场,根本没有选择的余地,所以,打不过就加入,努力的提升自己能技术能力,直接吊打面试官! 这不,就迎来了大厂级24W字java面试手
85 0
|
消息中间件 NoSQL Java
金九银十喜提offer!秋招蚂蚁金服Java研发岗四面
面试流程   先说下面试流程,一般大公司都有3-4轮技术面,1轮的HR面。就蚂蚁金服而言,我共经历了4轮技术面,前两轮主要是问基础和项目实现,第3轮是交叉面,两个面试官,主要是问项目实现和拓展。第4轮是部门老大面,主要就问一些架构、技术和业务的理解、个人发展比较抽象的东西了,现在基本也是这样的。
|
算法 数据库
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.29
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.29
95 0
程序人生 - 祝贺登榜《数据结构与算法领域内容榜》NO.29