在很多人心里,顺序表是数据结构最基础最简单的东西了,如果面试让我们手撕一道顺序表,相信大家心里早就乐开了花,但是面试官真的会出这么简单的题吗?

答案是:当然会,哈哈。

我们来看看面试官的要求:

请实现下面函数的接口,并且自己安排测试用例测试:

void SLInit(SL* ps);//初始化顺序表
void SLPrint(SL* ps);//打印顺序表中有效数据
void SLPushFront(SL* ps, SLDataType x);//头插
void SLPushBack(SL* ps, SLDataType x);//尾插
void SLPopFront(SL* ps);//头删
void SLPopBack(SL* ps);//尾删
int SLFind(SL* ps, SLDataType x);//找到x数据,并返回这是顺序表中第几位,找不到就返回-1
void SLInsert(SL* ps, int pos, SLDataType x);//在表中第pos位后插入数据x
void SLErase(SL* ps, int pos);//删除表中第pos位的数据
void SLDestroy(SL* ps);//释放顺序表

很人多肯定会说,就这就这?? 这不是顺序表的基操吗,有手就行

但是面试官接着说了一句话:

你能在20分钟内完成吗?你能够保证你的代码鲁棒性很好吗?

大家或许对于20min的概念不是特别强烈,20min实现上面10个函数的接口,并且还要自己测试代码是否有问题,20min内完成,平均每个接口不能超过2min,这还不算测试用例。如果还想让其规范性更高,分成3个文件是避免不了的(   text.c(测试接口功能 )     SeqList.c(接口的定义)   SeqList.h(头文件,接口的声明等等)    ),我自己测试了下,大概用了40多min(我太菜了,各位佬不要喷我)

下面是我实现接口的定义:SeqList.c

#define _CRT_SECURE_NO_WARNINGS 1#include"SeqList.h"void SLCheckCapacity(SL* ps)
{assert(ps);int newCapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;SLDataType* tmp = (SLDataType*)realloc(ps->a, newCapacity * sizeof(SLDataType));if (!tmp){printf("realloc fail\n");exit(-1);}ps->a = tmp;ps->capacity = newCapacity;
}void SLInit(SL* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->size = 0;
}void SLPrint(SL* ps)
{assert(ps);for (int i = 0; i < ps->size; i++){printf("%d\n", ps->a[i]);}
}void SLPushFront(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);int end = ps->size;while (end > 0){ps->a[end] = ps->a[end - 1];end--;}ps->a[end] = x;ps->size++;
}void SLPushBack(SL* ps, SLDataType x)
{assert(ps);SLCheckCapacity(ps);ps->a[ps->size] = x;ps->size++;
}void SLPopFront(SL* ps)
{assert(ps);assert(ps->size > 0);int begin = 0;while (begin < ps->size-1){ps->a[begin] = ps->a[begin + 1];begin++;}ps->size--;
}void SLPopBack(SL* ps)
{assert(ps);assert(ps->size > 0);ps->size--;
}int SLFind(SL* ps, SLDataType x)
{assert(ps);for (int i = 0; i < ps->size; i++){if (ps->a[i] == x){return i + 1;}}return -1;
}void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);if (pos > ps->size){printf("无法插入\n");return;}SLCheckCapacity(ps);int end = ps->size;while (end > pos){ps->a[end] = ps->a[end - 1];end--;}ps->a[end] = x;ps->size++;
}void SLErase(SL* ps, int pos)
{assert(ps);assert(ps->size > 0);int begin = pos;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}void SLDestroy(SL* ps)
{assert(ps);ps->a = NULL;ps->capacity = ps->size = 0;free(ps);
}

至于测试接口的功能每个人有不同的写法,鄙人的愚见是写一个测一个,出了问题方便及时修改,不然等到一起测试时程序奔溃了那可就要了老命了。另外测试时要尽可能的考虑所有情况,想删除数据时万一表中已经没有了数据应该怎么办?在第几位插入或者删除数据时输入的位置是否有效等等都应该是我们所考虑的。

回到上文,我们要怎样做才能将时间缩短到20min内呢?

这种像我一样硬来的话或许够呛(大佬请自动忽略),那有什么更好的办法吗?

我们发现在第几位删除插入数据好像也能够完成头删尾删头插尾插,举个栗子:

我们想尾插数据,不就是想在最后一位插入数据吗?那我们只要实现了随机插入的接口,头插尾插不也就是间接实现了吗?删除数据也同理。

有了这样的思路后我们不妨来试试写:

void SLInsert(SL* ps, int pos, SLDataType x)
{assert(ps);if (pos > ps->size){printf("无法插入\n");return;}SLCheckCapacity(ps);int end = ps->size;while (end > pos){ps->a[end] = ps->a[end - 1];end--;}ps->a[end] = x;ps->size++;
}void SLErase(SL* ps, int pos)
{assert(ps);assert(ps->size > 0);int begin = pos;while (begin < ps->size){ps->a[begin - 1] = ps->a[begin];begin++;}ps->size--;
}void SLPushFront(SL* ps, SLDataType x)
{SLInsert(ps, 0, x);
}void SLPushBack(SL* ps, SLDataType x)
{SLInsert(ps, ps->size, x);}void SLPopFront(SL* ps)
{SLErase(ps, 1);
}void SLPopBack(SL* ps)
{SLErase(ps, ps->size);
}

实现了SLInsert和SLErase这两个接口后实现头插尾插头删尾删就变得容易多了,能够节省很多时间,我又重新测试了一下大概花了20多min(可能是对函数接口不太熟悉的原因,我真的尽力了)

如果大佬有更好的方法,欢迎在评论区提出。

【面试官说实现一个顺序表,但听到要求后我沉默了】相关推荐

  1. 面试官:编写一个 SQL 查询,找出每个部门工资第二高的员工

    今天我们来看看大数据开发中row_number函数. 作为一名程序员,求职面试时时常会遇到需要编写一些基础的sql,编写sql这样做的目的主要是考验求职者的逻辑思维及编写sql基础能力.而row_nu ...

  2. Chat Top10 | 给面试官手写一个 Nacos,多少 K?

    每周推荐的最新 Chat Top10 没有固定主题,仅仅是编辑部参考多方评分和反馈挑选出来的好文章,不一定适合你的口味,建议小心食用- 我们一起看下第三期 Chat Top10 都有哪些内容 ???? ...

  3. java设计一个顺序表类的成员函数_顺序表代码讲解以及实现

    用C语言编写一个有关顺序表的程序代码 创建一个顺序表,其数据元素类型为整型: 在该顺序表中插入数据(#include #include #define MaxSize 50 typedef char ...

  4. C语言实现了一个顺序表(附完整源码)

    C语言实现了一个顺序表 顺序表 顺序表的概念 顺序表的存储结构 C语言实现了顺序表完整源码 顺序表 顺序表的概念 顺序表是线性表的顺序存储结构,加按顺序存储方式构造的线性表的存储结构. 说明:对于n个 ...

  5. java设计一个顺序表类的成员函数,用java编写一个逐个输出顺序表中所有数据元素的成员函数...

    import java.util.ArrayList; import java.util.List; public class Test { /** * @param args */ public s ...

  6. 实现一个顺序表的建立、查找、插入和删除操作【数据结构实验报告】

    文章目录 一.实验目的 二.算法说明 三.算法实现 四.测试效果 一.实验目的 1.熟悉将算法转换为程序代码的过程. 2.了解顺序表的逻辑结构特性,熟练掌握顺序表存储结构的c语言描述方法. 3.熟练掌 ...

  7. 顺序表的操作例题——已知一个顺序表L, 其中的元素递增有序排列,设计一个算法,插入一个元素x (x为int 后保持该顺序表仍然递增有序排列(假设插入操作总能成功)。

    一.[题目描述]: 已知一个顺序表L, 其中的元素递增有序排列,设计一个算法,插入一个元素x (x为int 后保持该顺序表仍然递增有序排列(假设插入操作总能成功). 二.[题目分析]: 由题干可知,解 ...

  8. 有一个顺序表L,其元素为整形数据,设计一个算法,将L中的所有小于表头元素的整数放在前半部分,大于表头元素的整数放在后半部分

    题目 有一个顺序表L,其元素为整形数据,设计一个算法,将L中的所有小于表头元素的整数放在前半部分,大于表头元素的整数放在后半部分 解答(天勤) /*************************** ...

  9. 面试官问:数据库 delete 表数据,磁盘空间还是被一直占用,为什么?

    以下文章来源方志朋的博客,回复"666"获面试宝典 最近有个上位机获取下位机上报数据的项目,由于上报频率比较频繁且数据量大,导致数据增长过快,磁盘占用多. 为了节约成本,定期进行数 ...

  10. 分布式id生成策略,我和面试官扯了一个半小时

    面试官:小伙子,你还记得我吗?我是上次面试你的那个面试官. 我心想:我去,怎么会不记得,我又不是青年痴呆,上次害我画了那么多图,还使劲敲了一个多钟的电脑,满脑子都是你的阴影. 我:记得记得,您好,很高 ...

最新文章

  1. 面向用户计算机,一款面向普通用户的防火墙软件,让你了解计算机到底产生了哪些网络流量?...
  2. 2017-02-20 注册.Net Framework4.0
  3. 【错误总结】Git- remote:error: this exceeds GitHub file size limit of 100.00 MB
  4. 如何用Java做玫瑰花数_c语言如何输出玫瑰花数?(代码示例)
  5. 输入一个字符串,将其逆序后输出
  6. bootstrap_bootstrap中日历范围选择插件daterangepicker的使用
  7. iOS之深入解析渲染的底层原理
  8. mysql-5.1.73-8.el6_在centos中安装mysql详细步骤说明
  9. NSIS UI 美化类插件分享
  10. java监听表变化_「Java Web开发」Filte(过滤器)、Listener(监听器)
  11. C#中唯一的三元运算符
  12. python实现同态滤波
  13. 技术干货合集【失效分析、PFMEA DFMEA关系、文件结果化、风险分析技术】
  14. Hadoop2.8.5详细教程(四)Linux集群搭建+免密登录
  15. Directx 9在vs2008 里面的环境配置
  16. youtube下载助手 firefox插件
  17. C语言中指数的表现,中证500指数基金C份额汇总比较
  18. 抱歉,我也不知道程序员35岁以后该怎么办!
  19. Python爬虫入门教程导航帖
  20. 7-5 快乐的尽头 (17 分)

热门文章

  1. python多线程爬取图虫网图片
  2. 知道python网课答案_分析最近的一个网课答案查询2.0
  3. 如何使用Lumion创建惊艳的渲染
  4. go语言编程前景怎么样?国内Go语言布道师许式伟这样说
  5. livox_camera_calib的使用
  6. 残差、方差、偏差、MSE均方误差、Bagging、Boosting、过拟合欠拟合和交叉验证
  7. SPSS详细操作:生存资料的Cox回归分析
  8. 李宏毅老师《机器学习》课程笔记-1深度学习简介
  9. 平板电脑也可以学python吗?10 个Python 编辑器,,让编程更贴近生活~
  10. 可视化数据库监控警报工具 —— Sampler