面试官一个简单的问题,让我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不已,下次不会再出现这样的错误了!


相关文章
|
5月前
|
设计模式 算法 NoSQL
Java开发三年四面字节跳动复习一个月斩获offer,寒冬并不可怕
目前互联网行业形势越来越严峻,我接连投递了很多的简历,得到的回复却是寥寥无几,索性好好复习了大概一个半月的样子,挑战字节跳动成功!!接下来分享我在字节面试遇到的面试题,欢迎大家文末留言与我一起讨论!
|
5月前
|
负载均衡 网络协议 算法
海投简历一个月无果,机遇巧合得前辈内推,五面蘑菇街终获offer
到目前为止使用Java到现在大概有两年多的时间,所以java算不上很好。刚开始投递的时候,刚辞职,也没准备笔试面试,很多东西都忘记了。所以,刚开始我并没有直接就投递蘑菇街,毕竟心里还是有一点点小害怕的。
|
8月前
|
消息中间件 Dubbo Java
大厂必刷!国内顶级“Java面试总汇2023”跳槽底气 统计通过率95%
前言 今天已经是金九银十的第15天了。不知现在有多少小伙伴找到自己满意的工作了。今年的面试比以往几年的都要多些难度。随着学习it的人越来越多竞争也是越来越多,越来越卷
52 0
|
8月前
|
消息中间件 算法 Java
面试造飞机? 网易在职顶级大佬“java面试真题 2023” (助上岸)
现在的互联网环境可以说是比较难受的了,学习it的越来越多行业越来越卷,导致更加多的程序员去争取更少的岗位。其实很多人的技术还是不错的但一面试可能还是会被刷下去。
72 0
|
9月前
|
消息中间件 缓存 NoSQL
闭关三月:整理出了这份对标阿里p7的java秋招面试必备指南。
大厂的面试从来不会是固定的,特别是像阿里这种一线互联网公司,想要进这种大厂,每个重点的知识点都是要了解的,给大家带来的春招面试必备指南会从面试官的心理分析,大厂经常问到的问题,以及对面试的问题分析,分享给大家,涉及到的知识点包含了有消息队列,Redis缓存,分库分表,读写分离,分布式系统,高可用架构,spring微服务,等架构专题
|
消息中间件 存储 算法
字节跳动这份面试题,你能打几分
字节跳动这份面试题,你能打几分
435 0
字节跳动这份面试题,你能打几分
|
XML JSON 网络协议
上月成功拿到字节跳动offer,全靠我啃烂了这份最新面试题
前言 不论是校招还是社招都避免不了各种面试、笔试,如何去准备这些东西就显得格外重要。不论是笔试还是面试都是有章可循的,我这个“有章可循”说的意思只是说应对技术面试是可以提前准备,所谓不打无准备的仗就是这个道理,以下为大家,描述了从面试准备到最后的拿到offer提供了非常详细的目录,建议可以从头看是看几遍,如果基础不错的话也可以挑自己需要的章节查看。
上月成功拿到字节跳动offer,全靠我啃烂了这份最新面试题
|
机器学习/深度学习 算法 小程序
双非硕士的辛酸求职回忆录: 第 3 篇 也谈谈校招项目面试究竟该注意什么及我是如何准备开发项目的
双非硕士的辛酸求职回忆录: 第 3 篇 也谈谈校招项目面试究竟该注意什么及我是如何准备开发项目的
239 0
|
SQL 前端开发 Java
Java开发:19届二本技术渣,校招与工作一个月辞职后的上岸之路
Java开发:19届二本技术渣,校招与工作一个月辞职后的上岸之路
147 0
|
缓存 负载均衡 算法
两年CRUD,没料到我这渣二本,备战两个月面试阿里,居然侥幸拿下P6的offer
对于很多没有学历优势的人来说,面试大厂是非常困难的,这对我而言,也是一样,出身于二本,原本以为就三点一线的生活度过一生,直到生活上的变故,才让我有了新的想法和目标,因此我这个二本渣渣也奋斗了起来,竟拿下了阿里P6岗。
192 0