数据结构算法面试总结

【数据结构】面试题整理 共36题 链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。与数组不同,链表中的元素在内存中不必是连续存储的,这使得链表在插入和删除操作时非常高效。单向链表(Singly Linked List):每个节点只包含一个指向下一个节点的指针。双向链表(Doubly Linked List):每个节点包含两个指针,一个指向下一个节点,一个指向前一个节点。循环链表(Circular Linked List):链表的最后一个节点指向第一个节点,形成一个环。 阅读详情

一 、数据结构包括:线性结构和非线性结构

1)线性结构

线性结构分为:顺序存储结构(存储元素是连续的)和链式存储结构(存储元素不是连续的)
线性结构特点:数据元素之间存在一一对应的关系
线性结构常见的有:数组、队列、链表、栈

2)非线性结构

非线性结构包括:二维数组、多维数组、广义表、图结构

1、稀疏数组

1)当一个数组中大部分元素都为0时、或者为同一个数值时 可以用稀疏数组来存储该数组
2)处理方法:
   1)记录数组一共几行几列,有多少个不同的值
   2)把具有不同值的元素的列行记录在一个小规模的数组中,从而缩小程序的规模

2. 二维数组转稀疏数组的思路

   1)遍历原始数组的二维数组,得到有效的个数sum
   2)根据sum数组就可以创建稀疏数组sqarseArr int[sum+1][3]
   3) 将二维数组的有效数据存入到稀疏数组

3. 稀疏数组转二维数组思路

   1)先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数据
      例如chessArr2=int[11][11]
   2)在读取稀疏数组后几行的数据 并赋值给原始的二维数组即可  
                                                     
                                                             2021.4.4

二、队列

 1)队列介绍
    队列是一个有序列表 可以用数组或者链表来表现
    遵循先进先出的原则 即先存入的数据 要先取出 后存入的要后取出
 2)数组模拟队列
    队列本身是有序列表,若使用数组的结构来存储队列的数据,则maxsize是该队列的最大容量
    因为队列的输出、输入时分别从前后端来处理的, 因此需要两个变量front和rear分别记录队列的前后端的下标,front会随着数据的输出而改变,而real则是则是随着数组的输出而改变  
  3)当我们将数据存入队列时称为“addqueue”,addqueue的处理需要有两个步骤,思路分析
    1)将数组的指针后移,real+1,当front==real【空】
    2)若尾指针real小于队列最大下标maxsize-1,则将数据存入real所指的数组元素中,否则无法存入数据,real==maxsize-1[队列满]
                                                  2021.4.5    

三 数组转环形数组 (通过取模的方法来实现)

思路
1) front变量的含义做一个调整: front就是指向队列的第一个元素,也就是说arr[front]就是队列的第一个元素,front初始值就是0.
2) Rear变量的含义做了一个调整:real指向队列元素的最后元素的前一个位置,因为希望空出一个空间做一个约定,real初始值是0
3) 当队列满时,条件是(real+1)%maxSize=front【满】
4) 队列为空的条件是:real=front
5) 队列中有效数据个数为:(real-front+maxSize)%maxSize
6) 这样我们就可以在原来队列修改得到一个环形队列
2021.4.6

四、链表(linked List)的介绍

①. 链表是有序的列表,但它在内存中是

小结:
1) 链表是以节点的方式来存储
2) 每个节点包含data域,next域:指向下一个节点
3) 如上图发现链表的各个节点不一定是连续存储的
4) 链表分带头节点的链表和没有头结点的链表,根据实际的需要来确定
创建(添加):
1) 先创建一个head头节点,作用是表示单链表的头
2) 后面我们每添加一个节点,就直接加入到链表的最后
3) 遍历:通过一个辅助遍历 帮助遍历整个链表

②.单链表应用实例

使用head头的单向链表实现水浒英雄排行榜管理

  1. 完成对英雄人物的增删改查
  2. 第一种方式在添加英雄时直接添加到链表的尾部
  3. 第二种方式是添加英雄时 根据排名将英雄插入到指定位置
    2021.4.7

③.第二种顺序添加方法的实现

1) 首先找到新添加的节点的位置,是通过辅助变量(指针),通过遍历搞定
2) 新的节点.next=temp.next
3) temp.next=新的节点

④.双向链表的遍历 添加 修改 删除的操作思路

  1. 遍历和单链表一样 只是可以向前 也可以向后
  2. 添加(默认添加到双向链表的最后)
  1. 先找到双向链表的最后这个节点
  2. Temp.next=newHeroNode
  3. newHeroNode…pre=temp
  1. 修改思路和原理和单链表一样
  2. 删除
  1. 因为是双向链表,因此我们可以实现自我删除某个节点
  2. 直接找到要删除的这个节点 比如temp
  3. Temp.pre.next=temp.next
  4. temp.next.pre=temp.pre

⑤. 构建一个单向的环形链表思路

  1. 先创建第一个节点,让first指向该节点,并形成环形
  2. 后面当我们每创建一个新的节点,就把该节点,加入到已有的
    环形链表中即可
    遍历环形链表
  3. 先让一个辅助指针(变量)temp 指向first节点
  4. 然后通过一个while循环遍历该环形链表即可 temp.next=first结束
    四.小孩出列
    根据用户的输入,生成一个小孩出圈的顺序
    n=5,即有5个人
    k=1,从第一个人开始报数
    m=2,数2下
  5. 需求创建一个辅助指针(变量)helper,事先应该
    指向环形链表的最后的这个节点
    补充:小孩报数前先让first和helper移动k-1次
    2. 当小孩报数前,先让first和helper同时移动m-1次
  6. 这时就可以将first指向的小孩出圈
    First=first.next
    Helper.next=first
    原来first指向的节点就没有任何的引用,就会被回收

五.栈

一). 栈的应用场景

1)子程序的调用:在跳往子程序前,会先将下一个指令的地址存到堆栈中,
直到子程序执行完后再将地址取出,以回到原来的程序中
2)处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,
也将参数、区域变量等数据存入堆栈中
3)表达式的转换[中缀表达式转后缀表达式] 与求值(实际解决)。
4)二叉树的遍历
5)图形的深度优先(depth–first)搜索法

二) 栈的介绍

1)栈的英文(stack)
2) 栈是一个先入后出(filo-first in last out)的有序列表
3)栈(stack)是限制限制线性表中元素的插入和删除只能在线性表的同一端
进行的特殊线性表,允许插入和删除的一端,为变化的一端,称为栈顶(top)
另一端为固定的一端,称为栈底
4) 根据占得定义可知,最先放入栈中的元素在栈底,最后放入的元素在栈顶
而删除元素正好相反,最后放入的元素最先删除
5) 图解方式说明出栈(pop)和入栈(push)的概念

三)实现栈的思路和分析

1.使用数组来模拟
2.定义一个top来表示栈顶,初始化为-1
3.入栈的操作,当有数据加入到栈时,top++,stack[top]=data
4.出栈操作,int value=stack[top],top–;return value;

四)使用栈完成表达式的计算思路

1.通过一个index值(索引),来遍历我们的表达式
2.如何是一个数字直接入栈
3.如何发现是一个符号 就分以下情况
1)如何发现当前符号栈为空,就直接入栈
2)如何符号栈有操作符,就进行比较,如何当前的操作符
的优先级小于或者等于栈中的操作符,就需要从栈中pop
出两个数,再从符号栈中pop出一个符号,进行运算,将
得到的结果入数栈,然后将当前的操作符入符号栈,如果
当前的操作符的优先级大于栈中的操作符,就直接入符号栈
4.当表达式扫描完毕,就顺序的从数栈的符号栈中pop出相
应的数和符号,并运行
5.最后在数栈中就只有一个数字,就是表达式的结果

五)中缀表达式转后缀表达式的思路步骤分析

  1. 初始化两个栈:运算符栈是s1和储存中间结果的栈
  2. 从左至右扫描中缀表达式
  3. 遇到操作数时,将其压入S2
  4. 遇到运算符时,比较其与S1栈顶运算符的优先级
    1) 如果S1为空,或者栈顶运算符为左括号,则直接将其运算符入栈
    2) 否则,若优先级比栈顶运算符的高,也将运算符压入s1
    3) 否则,将S1栈顶的运算符弹出并压入到S2中,再次转到(1)与s1中的新的栈顶运算符相比较
  5. 遇到括号时:
    1) 如果是左括号“(”,则直接压入s1
    2) 如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃
  6. 重复步骤2至5,直到表达书的最右边
  7. 将s1中剩余的运算符依次弹出并压入S2
  8. 依次弹出S2中的元素并输出,结果的逆序即为中缀表达式对应的后缀表达式
算法与数据结构面试题 简单地说,数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的,而对于其他操作则是低效的。首先我们需要理解各种数据结构,才能在处理实际问题时选取最合适的数据结构。树,二叉树:有左右子树的区分和度不超过2.二叉排序树:左子树均小于根,根均小于右节点。。线索二叉树:设置两个标识标记左右指针指向的是孩子还是前躯节点。平衡二叉树:左右子树高度差绝对值小于等于1。哈夫曼树:压缩用的。权值大小排列。完全二叉树:只能从右边为空。 阅读详情

相关推荐

面试中常见的数据结构与算法

第二章排序 2.1 O(n2) 算法 给定一数组,其大小为8个元素,数组内的数据无序。 6 3 5 7 0 4 1 2 冒泡排序:两两比较,将两者较少的升上去,第一次比较空间为0-(N-1)直到最后一轮比较空间为0-1 public class bubbleSort { public static void main(String[] args) { int...

昶羽天的博客 2万+

数据结构面试问题总结

杭电计算机考研复试,数据结构面试问题总结

Andy01_ 1644

2021最新汇总数据结构与算法面试题(准备面试的可以看看)

闲来无事整理了一下数据结构与算法面试题,准备面试的可以看看。 这份面试题汇总除了Java语言的,我还整理了C++和Golang语言的,无论你是做什么开发这份数据结构与算法面试题汇总都可以看,如果你是做Android开发的呢,就可以到我的主页获取更多Android相关的信息和资料。 话不多说,上干货。 一、Java 1.1 哈希 Java中的HashMap的工作原理是什么? 什么是Hashmap? 如何构造一致性哈希算法 hashCode() 和equals() 方法的重要性体现在什么地方? Object作

weixin_48091641的博客 2289

保研面试 算法题_计算机考研/保研复试重点整理-数据结构篇

先来一个知识框架图,前方高能预警好了,看完这个框架,你慌了吗?大家心里有个数之后,我们开始划重点,都去给我背!一、什么是数据结构?数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。结构包括逻辑结构和物理结构。数据的逻辑结构包括4种,(1)集合:数据元素之间除了有相同的数据类型再没有其他的关系 (2)线性结构:数据元素之间是一对一的关系 (3)树形结构...

weixin_39644915的博客 1949

数据结构与算法面试题80道

1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。 要求不能创建任何新的结点,只调整指针的指向。 10 / \ 6 14 / \ / \ 4 8 12 16 转换成双向链表 4=6=8=10=12=14=16。 首先我们定义的二元查找树 节点的数据结构如下: struct BSTreeNode{int m_nValue; // value of nodeBSTreeNode *m_pLeft; // left child of nodeBSTreeNo

m0_54854484的博客 1万+

JAVA面试大全之数据结构和算法篇

消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,目前可以解密逆向的只有CRC32算法,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。消息摘要算法主要应用在“数字签名”领域,作为对明文的摘要算法。何谓数字签名?数字签名主要用到了非对称密钥加密技术与数字摘要技术。数字签名技术是将摘要信息用发送者的私钥加密,与原文一起传送给接收者。

hao_kkkkk的专栏 450

java数据结构与算法面试题汇总

快速排序是一种高效的排序算法,它采用分治的思想,通过选择一个基准元素,将数组分为两部分,小于基准元素的部分和大于基准元素的部分,然后分别对这两部分进行递归排序。插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。给定两个单链表,判断它们是否有交点,如果有,返回交点的节点。反转一个单链表,即将链表的节点顺序反转。

m0_57836225的博客 2598

Java面试题超详细讲解系列之五【数据结构与算法篇】

图例结合五万字超详细讲解数据结构与算法面试会遇到的那些题

白大锅的博客,毕设WangLoveBai_999 5094

数据结构面试常见问题

本文介绍了与数据结构相关的面试题。

代码星辰的博客 1万+

微软等公司数据结构+算法面试100_前40(附答案)

微软等公司数据结构+算法面试100_前40(附答案)

常见数据结构与算法笔试面试题大集合

本人花几个月在多个优秀博客总结整理出来的,希望对大家有用。

算法与数据结构前端面试必备

算法与数据结构前端面试必备 本文深入解析了前端面试中必备的算法与数据结构知识,涵盖了常见排序算法的原理与实现、数据结构在前端的应用场景、算法复杂度分析与优化技巧,以及大厂算法面试真题解析。文章通过详细的代码示例、性能分析和实战案例,帮助读者全面掌握这些核心知识点,提升面试准备和实际开发能力。 常见排序算法原理与实现 在前端面试中,排序算法是必考的基础知识点。掌握常见排序算法的原理、实现方式和性能特...

gitblog_00560的博客 1023

微软等数据结构+算法面试100题全部答案集锦

微软等数据结构+算法面试100题全部答案集锦,收集了一些典型题目及算法

数据结构和算法的常见面试题

这些问题不仅覆盖了常见的数据结构(数组、链表、栈、队列、树、图等),还考察了重要的算法技巧(排序、动态规划、贪心算法、递归等)数据结构和算法是技术面试中的重点,尤其在软件工程师岗位。

hallo128的博客 1517

数据结构常见笔试题汇总

数据结构常见笔试题汇总 C语言的,笔试 面试 很好的资料

2021面试题总结数据结构篇.pdf

2021面试题总结数据结构篇.pdf

面试篇:(十七)数据结构与算法 - 2024 年前端面试算法专题

时间复杂度是描述算法执行时间的函数,它表示输入数据量增长时,算法运行时间的增长速率。空间复杂度是描述算法使用存储空间的函数,它表示输入数据量增长时,所需存储空间的增长速率。理解这两个复杂度对于评估算法性能和选择合适的解决方案非常重要。答案:栈(Stack):栈是一种后进先出(LIFO)的数据结构。例如,浏览器的历史记录就是一个栈结构,用户可以通过“后退”按钮返回到最近访问的页面。// 入栈// 出栈,输出 2队列(Queue):队列是一种先进先出(FIFO)的数据结构。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 916

IPsec (主模式,野蛮模式)

IPsec vpn的主模式和野蛮模式

七汣的博客 3417

全面&详细的面试指南:数据结构与算法篇 (附答案)

前言 背景:算法与数据结构作为技术开发者最基本的技术修养,在面试中出现的频率非常高 本文目的:花尽可能短的时间,快速学习面试中常见常考的数据结构知识及算法题 适用阅读人群:技术岗位面试开发者 本文主要内容: 常见、常考的数据结构知识 结合每种数据结构给出常见 & 经典的算法考题 每个知识点 & 考题都会从题目知识考点、多种思路分析到手写代码整个过程进行详细解析 目录 基础知识 1. 数据结构是什么? 储备知识:数据的定义 定义 具体类型 核心内容 1.1 储备知识:数据是.

Carson带你学Android 9542

告别手动改图!用Python+PyWin32驱动SolidWorks,实现参数自动化修改(保姆级避坑指南)

本文详细介绍了如何利用Python和PyWin32驱动SolidWorks实现参数自动化修改,提供从环境配置到API连接的工业级解决方案。通过实战案例和避坑指南,帮助工程师高效搭建自动化脚本工作流,显著提升设计效率。

weixin_30614109的博客 746

锐捷交换机配置SSH

锐捷交换机配置ssh 一、组网需求 通过ssh功能可以远程登录管理设备 二、配置步骤 全局开启ssh服务,并且指定ssh版本 Ruijie>enable Ruijie#configure terminal Ruijie(config)#enable service ssh-server ------>开启SSH服务,默认关闭 Ruijie(config)#ip ssh version 2 ------>默认1.99版本,设置为版本2 添加登

Loners_fan的博客 1万+
上一篇: 基数排序-八大排序(七)
下一篇: 线性查找-四大查找算法(一)
来来爱编程
博客等级 码龄7年 375粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值