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


相关文章
|
4月前
|
缓存 算法 NoSQL
凭借一份“面试真经pdf”,我四面字节跳动,拿下1-2级offer
近两年是中国互联网企业组织架构升级的大年,阿里、腾讯、小米、快手等知名互联网企业都进行了相应调整。2020年3月12日,字节跳动成立八周年之际,宣布组织全面升级,而这一消息也彻底激起了我对字节跳动的期待。
|
4月前
|
NoSQL 算法 Java
三面阿里云被虐,15天读完这份pdf文档,我拿下“美团通知单”
首先介绍一下我的个人背景,鄙人小康家庭,父母都是普通职业,供我读书长大不容易,好在我也算争气,高考发挥正常,考了个还算不错的大学,华南地区某211。今年的金三银四本是想好好拼一把,奈何受到疫情影响,只能将自己的计划缩减又缩减,所以第一家选择去面试的阿里,奈何三面被虐得“体无完肤”,好在自己并未气馁,复习15天后去面试了美团,最终4面拿下了offer。
|
5月前
|
设计模式 算法 NoSQL
Java开发三年四面字节跳动复习一个月斩获offer,寒冬并不可怕
目前互联网行业形势越来越严峻,我接连投递了很多的简历,得到的回复却是寥寥无几,索性好好复习了大概一个半月的样子,挑战字节跳动成功!!接下来分享我在字节面试遇到的面试题,欢迎大家文末留言与我一起讨论!
|
5月前
|
算法 网络协议 Java
备战春招狂刷这份大厂级24W字java面试手册2个月可成功逆袭上岸!
前言 2023年金九银十程序员跳槽或者找工作并不理想,迟迟找不到工作,甚至大厂还进行几轮裁员,导致整个就业市场都不是太好! 出现这种情况是因为中美贸易战,导致大环境不好、大厂裁员、就业情况差、企业要求变高、各行各业越来越卷,尤其是程序员,处于这个阶段,感觉特别明显! 对于程序员这个群体来说,java程序员的占比就非常之高,就业市场等于说是千军万马过独木桥,简直可以说是太难了!卷不过、根本卷不过! 在这里想说的是,大环境已经这样了,我们已经也无法左右这个市场,根本没有选择的余地,所以,打不过就加入,努力的提升自己能技术能力,直接吊打面试官! 这不,就迎来了大厂级24W字java面试手册!
|
5月前
|
监控 Java 应用服务中间件
硬核神作|2w字带你拿下Sentinal
硬核神作|2w字带你拿下Sentinal
|
10月前
|
设计模式 NoSQL Java
直击面试!阿里技术官手码12W字面试小册在Github上爆火
临近金三银四,想必有不少老哥已经在为面试做准备了。大家想必也知道现在面试就是看项目经验+基本技术+个人潜力(也就是值不值得培养)。总之就是每一次面试都是对我们能力的检验(无论是软实力还是硬实力)。软实力其实就是简历包装,自我介绍,与面试官交谈技巧等等;所谓硬实力就是我们所掌握的技术情况了。所以每次面试之前需要做好充分的准备,切不可临时抱佛脚。技术基础打好后,面试前算题巩固也是必不可少的!
|
6月前
|
消息中间件 Dubbo Java
GitHub标星翻倍!阿里大牛呕心沥血终成39w字Java面试笔记
好不容易有个大厂面试机会,面试官才问了两三个问题,就已经回答不上来的,只想找个地缝钻进去,连进入技术面的机会都没有,现在大厂都在大量招聘Java工程师,但面试题怎么都这么难?!
|
8月前
|
消息中间件 Dubbo Java
裸辞底气!GitHub飙升“java面试笔记2023” 了解下八股文天花板
前言 现在不管是校招还是社招都避免不了面试,而我们程序员面试又避免不了八股文,得疯狂的去背。但很多朋友都背的很盲目资料也不够好。
68 0
|
8月前
|
消息中间件 Dubbo Java
大厂必刷!国内顶级“Java面试总汇2023”跳槽底气 统计通过率95%
前言 今天已经是金九银十的第15天了。不知现在有多少小伙伴找到自己满意的工作了。今年的面试比以往几年的都要多些难度。随着学习it的人越来越多竞争也是越来越多,越来越卷
51 0
|
8月前
|
Dubbo Java 关系型数据库
解决90%BAT大厂!京东在职大佬实测总汇“java面试真题”颠覆认知
金九银十的高峰已经到来,但现在没找到满意工作的小伙伴还是有很多。包括我的朋友因为工作上的一些小问题毅然决然的裸辞来,结果现在的就业环境弄的到现在都没找到一份合适的。面试也是一波又一波的把他打倒了。