数据结构与算法简析,你都会了吗

139 阅读7分钟

前言

不积跬步无以至千里,不积小流无以成江海。学如逆水行舟,不进则退。我是平平无奇游荡于各平台的搬运工。每天学习半小时,健康幸福一辈子。今天给大家讲讲数据结构与算法方面相关的面试题。废话不多说,直接给大家上干货,希望能对你有所帮助,优秀的人已经点赞了。

集合结构 线性结构 树形结构 图形结构

  • 1.1、集合结构 说白了就是一个集合,就是一个圆圈中有很多个元素,元素与元素之间没有任何关系 这

个很简单

  • 1.2、线性结构 说白了就是一个条线上站着很多个人。 这条线不一定是直的。也可以是弯的。也可以

是值的 相当于一条线被分成了好几段的样子 (发挥你的想象力)。 线性结构是一对一的关系

  • 1.3、树形结构 说白了 做开发的肯定或多或少的知道 xml 解析 树形结构跟他非常类似。也可以想象

成一个金字塔。树形结构是一对多的关系

  • 1.4、图形结构 这个就比较复杂

数据结构的存储

数据结构的存储一般常用的有两种 顺序存储结构 和 链式存储结构

  • 2.1 顺序存储结构

发挥想象力啊。 举个列子。数组。1-2-3-4-5-6-7-8-9-10。这个就是一个顺序存储结构 ,存储是按顺序的 举

例说明啊。 栈。做开发的都熟悉。栈是先进后出 ,后进先出的形式 对不对 ?!他的你可以这样理解

hello world 在栈里面从栈底到栈顶的逻辑依次为 h-e-l-l-o-w-o-r-l-d 这就是顺序存储 再比如

队列 ,队列是先进先出的对吧,从头到尾 h-e-l-l-o-w-o-r-l-d 就是这样排对的

  • 2.2 链式存储结构

再次发挥想象力 这个稍微复杂一点 这个图片我一直弄好 ,回头找美工问问,再贴上 例如还是一个数组 1-2-3-4-5-6-7-8-9-10 链式存储就不一样了 1(地址)-2(地址)-7(地址)-4(地址)-5(地址)-9(地址)-8(地址)-3(地址)-6(地址)-10(地址)。每个数字后面跟着一个地址 而且存储形式不再是顺序 ,也就说顺序乱了,1(地址)1 后面跟着的这个地址指向的是 2,2 后面的地址指向的是 3,3 后面的地址指向是谁你应该清楚了吧。他 执行的时候是 1(地址)-2(地址)-3(地址)-4(地址)-5(地址)-6(地址)-7(地址)-8(地址)-9(地址)-10(地址),但是存储的时候就是完全随机的。明白了?!

单向链表\双向链表\循环链表 还是举例子。理解最重要。不要去死记硬背 哪些什么。定义啊。逻辑啊。理解才是最重要滴

  • 3.1 单向链表 A->B->C->D->E->F->G->H. 这就是单向链表 H 是头 A 是尾 像一个只有一个头的火车一样 只能一个头拉 着跑

QQ截图16.png 数组和链表区别:

数组:数组元素在内存上连续存放,可以通过下标查找元素;插入、删除需要移动大量元素,比较适用元 素很少变化的情况 链表:链表中的元素在内存中不是顺序存储的,查找慢,插入、删除只需要对元素指针重新赋值,效率高 

  • 3.3 循环链表

循环链表是与单向链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指 向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。发挥想象力 A->B->C->D->E->F->G->H->A. 绕成一个圈。就像蛇吃自己的这就是循环 不需要去死记硬背哪些理论知识。

二叉树/平衡二叉树

  • 4.1 什么是二叉树

树形结构下,两个节点以内 都称之为二叉树 不存在大于 2 的节点 分为左子树 右子树 有顺序 不能颠 倒 ,懵逼了吧,你肯定会想这是什么玩意,什么左子树右子树 ,都什么跟什么鬼? 现在我以普通话再讲 一遍,你把二叉树看成一个人 ,人的头呢就是树的根 ,左子树就是左手,右子树就是右手,左右手可以 都没有(残疾嘛,声明一下,绝非歧视残疾朋友,勿怪,勿怪就是举个例子,i am very sorry) , 左右 手呢可以有一个,就是不能颠倒。这样讲应该明白了吧

二叉树有五种表现形式

1.空的树(没有节点)可以理解为什么都没 像空气一样

2.只有根节点。 (理解一个人只有一个头 其他的什么都没,说的有点恐怖)

3.只有左子树 (一个头 一个左手 感觉越来越写不下去了)

4.只有右子树

5.左右子树都有

二叉树可以转换成森林 树也可以转换成二叉树。这里就不介绍了 你做项目绝对用不到

数据结构大致介绍这么多吧。理解为主, 别死记,死记没什么用

QQ截图17.png

3、模拟栈操作

  • 栈是一种数据结构,特点:先进后出 -

  • 练习:使用全局变量模拟栈的操作

#include <stdio.h>

#include <stdbool.h>

#include <assert.h>

//保护全局变量:在全局变量前加 static 后,这个全局变量就只能在本文件中使用

static int data[1024];//栈最多能保存 1024 个数据

static int count = 0;//目前已经放了多少个数(相当于栈顶位置)

QQ截图18.png

4、排序算法

选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:

都将数组分为已排序部分和未排序部分。

1.选择排序将已排序部分定义在左端,然后选择未排序部分的最小元素和未排序部分的第一个元素交换。

2.冒泡排序将已排序部分定义在右端,在遍历未排序部分的过程执行交换,将最大元素交换到最右端。

3.插入排序将已排序部分定义在左端,将未排序部分元的第一个元素插入到已排序部分合适的位置。

QQ截图19.png

QQ截图20.png

QQ截图21.png

三、算法面试题(二)

QQ截图22.png

序数组合并

将有序数组 {1,4,6,7,9} 和 {2,3,5,6,8,9,10,11,12} 合并为

{1,2,3,4,5,6,6,7,8,9,9,10,11,12}

QQ截图23.png

HASH 算法

  • 哈希表

例:给定值是字母 a,对应 ASCII 码值是 97,数组索引下标为 97。

这里的 ASCII 码,就算是一种哈希函数,存储和查找都通过该函数,有效地提高查找效率。

  • 在一个字符串中找到第一个只出现一次的字符。如输入"abaccdeff",输出'b'字符(char)是一个长度为 8

的数据类型,因此总共有 256 种可能。每个字母根据其 ASCII 码值作为数组下标对应数组种的一个数

字。数组中存储的是每个字符出现的次数。

QQ截图24.png

QQ截图25.png

求无序数组中的中位数

中位数:当数组个数 n 为奇数时,为(n + 1)/2,即是最中间那个数字;当 n 为偶数时,为(n/2 + (n/2 + 1))/2,

即是中间两个数字的平均数。

首先要先去了解一些几种排序算法:iOS 排序算法

思路:

  • 1.排序算法+中位数

首先用冒泡排序、快速排序、堆排序、希尔排序等排序算法将所给数组排序,然后取出其中位数即可。

  • 2.利用快排思想

总结

今天的面试就分享到这里了,希望对各位看官能有小小的帮助。下回分解: 一、HTTP 协议 二、HTTP 的请求方式 三、HTTP 的特点 四、HTTPS、对称加密、非对称加密 五、对称加密和非对称加密 六、TCP 的特点和报文结构 七、三次握手 八、四次挥手 九、可靠数据传输 十、流量控制 十一、拥塞控制 十二、拥塞避免 十三、快速恢复 十四、DNS 十五、DNS 服务器 十六、DNS 解析过程 十七、DNS 记录和报文 十八、DNS 解析安全问题 十九、Cookie 二十、Session 二十一、Cookie 和 Session 的区别: 二十二、IP 协议 二十三、IP 数据报分片 二十四、IPv4 编址 二十五、IPv6 数据报格式 二十六、从 IPv4 到 IPv6 的迁移

答案