2022数据结构最新面试题(大厂必备)

2023-02-27 10:05:38 浏览数 (1)

1.什么是数据?     1.所有能被输入到计算机中,且能被计算机处理的符号的总称。如:实数、整数、字符(串)、图形和声音等。     2.是计算机操作对象的集合。     3.是计算机处理的信息的某种特定的符号表示形式。 2.什么是数据元素?     1.是数据(集合)中的一个“个体”     2.是数据结构中讨论的基本单位     3.不同场合也叫结点、顶点、记录 3.什么是数据项?     1.是数据结构中讨论的最小单位     2.数据元素是由若干个数据项组成 4.什么是存储结构?     1.顺序存储     2.链式存储     3.索引存储     4.散列存储

5.数据的操作     1.逻辑机构,存储结构,和运算 是数据结构讨论中不可分割的3个方面 6.算法概述     1.算法是对特定问题求解步骤的一种描述,是指令的有限序列。其中每条指令表示一个或多个操作。 7.算法的五种性质     1.有穷性     2.确定性     3.有效性     4.输入     5.输出 8.算法设计的目标     1.正确性     2.可读性     3.健壮性     4.高效率(时间与空间) 9.数据操作     1.初始化:创建、销毁:     2.数据操作:插入/添加、删除、修改     3.数据使用:查找、遍历 10.算法的描述方式:     1.自然语言     2.程序设计语言     3.伪代码     4.流程图

11.多项式时间算法的时间复杂度有多种形式,其中最常见的形式如下     1.常量阶:O(1)     2.线性阶:O(n)     3.平方阶:O(n2)     4.立方阶     5.对数阶     6.线性对数阶 12.按照数据元素之间逻辑关系的特性来分,可将数据结构归纳为以下4类:     1.集合         集合中数据元素之间除了“同属于一个集合”的特性外,数据元素之间无其他关系,它们之间的关系称为是松散性的     2.线性结构         线性结构中数据元素之间存在“一对一”的关系     3.树形结构         树形结构中数据元素之间存在“一对多”的关系     4.图形结构         图形结构中数据元素之间存在“多对多”的关系 13.算法的时间复杂度分析     算法时间复杂度的高低直接反应算法执行时间的长短,而算法的执行时间需要通过依据该算法编写的程序在计算机上执行所消耗的时间来度量 14.影响一个程序的执行时间的主要因素有如下几个方面     1.算法本身所用的策略     2.问题规模即处理问题时所处理的数据元素的个数     3.程序设计所采用的语言工具     4.编译程序所产生的机器代码质量     5.计算机执行指令的硬件速度     6.程序运行的软件环境 15.线性表:是一种最常用、最简单,也是最基本的数据结构 16.线性表由n个数据元素所构成的有限序列,且数据类型相同 17.线性表可以用`顺序存储`和`链式存储`两种存储结构来表示     使用`顺序存储`的线性表称为顺序表。     使用`链式存储`的线性表称为链表。 18.链表的分类:单链表、双向链表、循环链表 19.顺序表就是顺序存储的线性表 20.顺序存储是用一组地址连续的存储单元依次存放线性表中各个数据元素的存储结构     1.在逻辑上,数据ABCD是连续     2.在物理上,地址也是连续的 21.线性表地址公式:Loc(Ai) = Loc(A0) i * c => (第i的地址 = 第一个地址 第几个 * 存储单位) 22.顺序表特点     1. 在线性表中逻辑上相邻的数据元素,在物理存储位置上也是相邻的。     2. 存储密度高。但需要预先分配“足够”的存储空间。         存储密度 = 数据元素存储空间 / 数据元素实际占用空间         在顺序表中,存储密度为1。     3. 便于随机存储。(数组中可以通过下标进行存储)     4. 不便于插入和删除操作。两种操作都会引起大量的数据移动。 23.顺序表的插入操作:     将第i个数据元素及其之后的所有的数据元素,后移一个存储位置,再将新元素插入到i处     /**      * @Param i 第i个位置      * @Param x 需要插入的数据      */     public void insert(int i, Object x) {         //0.1 满校验:存放实际长度 和 数组长度 一样         if(curLen == listEle.length) {             throw new Exception("已满");         }         //0.2 非法校验,在已有的数据中间插入 [0, curLen],必须连续,中间不能空元素         if(i < 0 || i > curLen) {             throw new Exception("位置非法");         }         //1 将i及其之后后移         for(int j = curLen ; j > i; j --) {             listEle[j] = listEle[j-1];         }         //2 插入i处         listEle[i] = x;         //3 记录长度         curLen ;     } 24.顺序表的删除操作     将第i个数据元素ai之后的所有数据元素向前一定一个     public void remove(int i ) throws Exception {         // 0.1 校验非法数据         if(i < 0 || i > curLen - 1 ) {             throw new Exception("位置非法");         }         // 1 将i之后向前移动         for(int j = i ; j < curLen - 1 ; j ) {             listEle[j] = listEle[j 1];         }         // 2 长度减一         curLen--;     } 25.顺序表的查找操作     1.循环遍历已有数据,进行判断,如果有返回第一个索引号,如果没有返回-1     public int indexOf(Object x) {         for(int i = 0; i < curLen ; i ) {             if(listEle[i].equals(x)) {                 return i;             }         }         return -1;     }     2.使用变量记录没有匹配到索引     public int indexOf(Object x) {         int j = 0;        //用于记录索引信息         while(j < curLen && !listElem[j].equals(x)) {             j ;         }         // j记录索引小于数量         if(j < curLen ) {             return j;         } else {             return -1         }     }

0 人点赞